मैंने कॉन्फ़िगरेशन के रूप में "वेब एप्लिकेशन (मॉडल-व्यू-कंट्रोलर)" टेम्प्लेट और ".Net Framework" + "ASP.NET Core 2" का उपयोग करके VS17 में एक नया ASP.NET कोर वेब एप्लिकेशन प्रोजेक्ट बनाया है। प्रमाणीकरण कॉन्फ़िगरेशन "व्यक्तिगत उपयोगकर्ता खाते" पर सेट है।

मेरे पास निम्न नमूना समापन बिंदु है:

[Produces("application/json")]
[Route("api/price")]
[Authorize(Roles = "PriceViwer", AuthenticationSchemes = "Cookies,Bearer")]
public class PriceController : Controller
{

    public IActionResult Get()
    {
        return Ok(new Dictionary<string, string> { {"Galleon/Pound",
                                                   "999.999" } );
    }
}

"Cookies,Bearer", CookieAuthenticationDefaults.AuthenticationScheme और JwtBearerDefaults.AuthenticationScheme को जोड़कर बनाया गया है।

उद्देश्य अंतिम बिंदु के लिए प्राधिकरण को कॉन्फ़िगर करने में सक्षम होना है ताकि टोकन और कुकी प्रमाणीकरण विधियों दोनों का उपयोग करके इसे एक्सेस करना संभव हो।

मेरे Startup.cs में प्रमाणीकरण के लिए मेरे पास सेटअप है:

    services.AddAuthentication()
        .AddCookie(cfg => { cfg.SlidingExpiration = true;})
        .AddJwtBearer(cfg => {
            cfg.RequireHttpsMetadata = false;
            cfg.SaveToken = true;
            cfg.TokenValidationParameters = new TokenValidationParameters() {
                                                    ValidIssuer = Configuration["Tokens:Issuer"],
                                                    ValidAudience = Configuration["Tokens:Issuer"],
                                                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"]))
                                                };
        });

इसलिए, जब मैं ब्राउज़र का उपयोग करके एंडपॉइंट तक पहुंचने का प्रयास करता हूं, तो मुझे एक खाली HTML पृष्ठ के साथ 401 प्रतिक्रिया मिलती है।
मुझे एक खाली html पृष्ठ के साथ 401 प्रतिक्रिया मिलती है।

फिर मैं लॉगिन करता हूं और जब मैं फिर से एंडपॉइंट तक पहुंचने का प्रयास करता हूं, तो मुझे वही प्रतिक्रिया मिलती है।

फिर, मैं वाहक टोकन निर्दिष्ट करके समापन बिंदु तक पहुंचने का प्रयास करता हूं। और वह 200 प्रतिक्रिया के साथ वांछित परिणाम देता है।
और यह 200 प्रतिक्रिया के साथ वांछित परिणाम देता है।

तो फिर, अगर मैं [Authorize(AuthenticationSchemes = "Cookies,Bearer")] को हटा देता हूं, तो स्थिति विपरीत हो जाती है - कुकी प्रमाणीकरण काम करता है और 200 लौटाता है, हालांकि ऊपर इस्तेमाल की गई समान वाहक टोकन विधि कोई परिणाम नहीं देती है और केवल डिफ़ॉल्ट AspIdentity लॉगिन पृष्ठ पर रीडायरेक्ट करती है।

मैं यहां दो संभावित समस्याएं देख सकता हूं:

1) ASP.NET कोर 'संयुक्त' प्रमाणीकरण की अनुमति नहीं देता है। 2) 'कुकीज़' एक मान्य स्कीमा नाम नहीं है। लेकिन फिर उपयोग करने के लिए क्या सही है?

कृपया सलाह दें। धन्यवाद।

36
maximiniini 25 अक्टूबर 2017, 20:07

1 उत्तर

अगर मैं प्रश्न को सही ढंग से समझता हूं तो मेरा मानना ​​​​है कि एक समाधान है। निम्नलिखित उदाहरण में मैं एक ही ऐप में कुकी और बियरर प्रमाणीकरण का उपयोग कर रहा हूं। [Authorize] विशेषता का उपयोग योजना को निर्दिष्ट किए बिना किया जा सकता है, और ऐप उपयोग किए जा रहे प्राधिकरण की विधि के आधार पर गतिशील रूप से प्रतिक्रिया करेगा।

services.AddAuthentication को 2 प्रमाणीकरण योजनाओं को पंजीकृत करने के लिए दो बार कॉल किया जाता है। समाधान की कुंजी कोड स्निपेट के अंत में services.AddAuthorization को कॉल करना है, जो ASP.NET को दोनों योजनाओं का उपयोग करने के लिए कहता है।

मैंने इसका परीक्षण किया है और ऐसा लगता है कि यह अच्छी तरह से काम करता है।

(Microsoft डॉक्स< पर आधारित /ए>।)

services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = "oidc";
    })
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddOpenIdConnect("oidc", options =>
    {
        options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.Authority = "https://localhost:4991";
        options.RequireHttpsMetadata = false;

        options.ClientId = "WebApp";
        options.ClientSecret = "secret";

        options.ResponseType = "code id_token";
        options.Scope.Add("api");
        options.SaveTokens = true;
    });

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = "https://localhost:4991";
        options.RequireHttpsMetadata = false;
        // name of the API resource
        options.Audience = "api";
    });

services.AddAuthorization(options =>
{
    var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
        CookieAuthenticationDefaults.AuthenticationScheme,
        JwtBearerDefaults.AuthenticationScheme);
    defaultAuthorizationPolicyBuilder =
        defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
    options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
});

संपादित करें

यह प्रमाणीकृत उपयोगकर्ताओं के लिए काम करता है, लेकिन अगर उपयोगकर्ता ने अभी तक लॉग इन नहीं किया है तो बस 401 (अनधिकृत) देता है।

यह सुनिश्चित करने के लिए कि अनधिकृत उपयोगकर्ताओं को लॉगिन पृष्ठ पर पुनर्निर्देशित किया गया है, अपनी स्टार्टअप कक्षा में Configure विधि में निम्न कोड जोड़ें। नोट: यह आवश्यक है कि नया मिडलवेयर app.UseAuthentication() कॉल करने के बाद रखा जाए।

app.UseAuthentication();
app.Use(async (context, next) =>
{
    await next();
    var bearerAuth = context.Request.Headers["Authorization"]
        .FirstOrDefault()?.StartsWith("Bearer ") ?? false;
    if (context.Response.StatusCode == 401
        && !context.User.Identity.IsAuthenticated
        && !bearerAuth)
    {
        await context.ChallengeAsync("oidc");
    }
});

यदि आप इस पुनर्निर्देशन को प्राप्त करने का अधिक स्पष्ट तरीका जानते हैं, तो कृपया एक टिप्पणी पोस्ट करें!

21
David Kirkland 12 अप्रैल 2019, 19:15