ASP.NET Core 2.0 प्रमाणीकरण मिडिलवेयर


89

कोर 1.1 के साथ @ ब्लर्डार्ट की सलाह का पालन किया और एक कस्टम मिडलवेयर लागू किया:

https://stackoverflow.com/a/31465227/29821

यह इस तरह काम किया:

  1. मिडलवेयर भाग गया। अनुरोध हेडर से एक टोकन उठाया।
  2. टोकन को सत्यापित किया गया और यदि वैध ने कोई पहचान बनाई है (ClaimsIdentity) जिसमें कई दावे थे जो तब उसने HttpContext.User.AddIdentity () के माध्यम से जोड़े;
  3. ConfigureServices में सेवाओं का उपयोग करते हुए। AddAuthorization मैंने मिडलवेयर द्वारा प्रदान किए गए दावे की आवश्यकता के लिए एक नीति जोड़ी है।
  4. नियंत्रकों / कार्यों में मैं तब [अधिकृत (भूमिकाएं = "कुछ भूमिका जो मिडलवेयर जोड़ा गया") का उपयोग करूंगा]]

यह कुछ हद तक 2.0 के साथ काम करता है, सिवाय इसके कि यदि टोकन वैध नहीं है (चरण 2 ऊपर) और दावा कभी नहीं जोड़ा गया है तो मुझे "कोई प्रमाणीकरण नहीं मिला है कि निर्दिष्ट किया गया था, और कोई DefaultChallengeScheme नहीं मिला।"

तो अब मैं पढ़ रहा हूँ कि 2.0 में बदल गया है:

https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x

ASP.NET Core 2.0 में एक ही काम करने के लिए मेरे लिए सही रास्ता क्या है? मुझे वास्तव में कस्टम प्रमाणीकरण करने के लिए एक उदाहरण नहीं दिखता है।


इस लिंक की कोशिश करें, भले ही यह 2 योजनाओं का कहना है, लेकिन यह यू प्रमाणीकरण पर प्रमुख हैं देना होगा wildermuth.com/2017/08/19/...
मिथुन Pattankar

क्या आप अपना कोड जोड़ सकते हैं ताकि हम देख सकें? मुझे पता है कि मेरे पास JWT के साथ Core2.0 में मुद्दे थे - इसे स्टार्टअप में इधर-उधर घुमाने का मामला था
Webezine

जवाबों:


194

इसलिए, इस समस्या को हल करने के प्रयास के एक लंबे दिन के बाद, मैंने आखिरकार यह पता लगा लिया है कि कैसे Microsoft चाहता है कि हम कोर 2.0 में अपने नए सिंगल-मिडलवेयर सेटअप के लिए कस्टम प्रमाणीकरण हैंडलर बनाना चाहते हैं।

MSDN पर कुछ प्रलेखन के माध्यम से देखने के बाद, मैंने एक वर्ग पाया जो AuthenticationHandler<TOption>कि IAuthenticationHandlerइंटरफ़ेस को लागू करता है।

वहां से, मुझे https://github.com/aspnet/Security पर मौजूद मौजूदा प्रमाणीकरण योजनाओं के साथ एक पूरा कोडबेस मिला

इनमें से एक के अंदर, यह दिखाता है कि Microsoft JwtBearer प्रमाणीकरण योजना को कैसे लागू करता है। ( https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer )

मैंने उस कोड को एक नए फ़ोल्डर में कॉपी किया, और सभी चीजों को हटा दिया JwtBearer

में JwtBearerHandlerवर्ग (जो फैली हुई है AuthenticationHandler<>), वहाँ के लिए एक ओवरराइड हैTask<AuthenticateResult> HandleAuthenticateAsync()

मैं एक कस्टम टोकन सर्वर के माध्यम से दावों की स्थापना के लिए हमारे पुराने मिडलवेयर में जोड़ा, और अभी भी अनुमतियों के साथ कुछ मुद्दों का सामना कर रहा था, बस एक बाहर थूकना 200 OKएक के बजाय 401 Unauthorizedजब एक टोकन अमान्य था और कोई दावा नहीं स्थापित किया गया।

मुझे एहसास हुआ कि मैंने ओवरराइड Task HandleChallengeAsync(AuthenticationProperties properties)किया था जो किसी भी कारण से [Authorize(Roles="")]नियंत्रक में अनुमतियों को सेट करने के लिए उपयोग किया जाता है ।

इस ओवरराइड को हटाने के बाद, कोड ने काम किया था, और 401जब अनुमतियाँ मेल नहीं खाती थीं, तब सफलतापूर्वक फेंक दिया था।

इसका मुख्य तरीका यह है कि अब आप एक कस्टम मिडलवेयर का उपयोग नहीं कर सकते हैं, आपको इसे लागू करना AuthenticationHandler<>होगा DefaultAuthenticateSchemeऔर DefaultChallengeSchemeउपयोग करते समय आपको इसे सेट करना होगा services.AddAuthentication(...)

यहाँ एक उदाहरण है कि यह सब क्या दिखना चाहिए:

Startup.cs / ConfigureServices () में जोड़ें:

services.AddAuthentication(options =>
{
    // the scheme name has to match the value we're going to use in AuthenticationBuilder.AddScheme(...)
    options.DefaultAuthenticateScheme = "Custom Scheme";
    options.DefaultChallengeScheme = "Custom Scheme";
})
.AddCustomAuth(o => { });

Startup.cs / कॉन्फ़िगर () में जोड़ें:

app.UseAuthentication();

एक नई फ़ाइल CustomAuthExtensions.cs बनाएं

public static class CustomAuthExtensions
{
    public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<CustomAuthOptions> configureOptions)
    {
        return builder.AddScheme<CustomAuthOptions, CustomAuthHandler>("Custom Scheme", "Custom Auth", configureOptions);
    }
}

एक नई फ़ाइल CustomAuthOptions.cs बनाएँ

public class CustomAuthOptions: AuthenticationSchemeOptions
{
    public CustomAuthOptions()
    {

    }
}

एक नई फ़ाइल CustomAuthHandler.cs बनाएं

internal class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{
    public CustomAuthHandler(IOptionsMonitor<CustomAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
    {
        // store custom services here...
    }
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // build the claims and put them in "Context"; you need to import the Microsoft.AspNetCore.Authentication package
        return AuthenticateResult.NoResult();
    }
}

1
महान पोस्ट, लेकिन मुझे आपके कोड को संकलित करने में कुछ समस्याएं हैं। CustomAuthOptions और AuthenticateResult प्रकार अनुपलब्ध हैं। क्या आप उन्हें पोस्ट कर सकते हैं?
एलेक्स

8
क्या आप एक Github रेपो पर कोड में अपने निष्कर्ष साझा करने के लिए तैयार हैं?
22

2
क्या आप कृपया समझा सकते हैं DefaultAuthenticateSchemeऔर DefaultChallengeScheme? मुझे समझ नहीं आ रहा है कि इन दोनों का उपयोग क्यों किया जाता है? और उनके बीच क्या अंतर है।
मोहम्मद नोरेल्डिन

11
+1 के लिए "वहां से, मुझे github.com/aspnet/Security पर मौजूद मौजूदा प्रमाणीकरण योजनाओं के साथ एक संपूर्ण कोडबेस मिला ।" जैसा कि आप इस (वास्तव में उत्कृष्ट) उत्तर के साथ पालन करते हैं, बस ASP.NET टीम इसे कैसे देखती है। क्या हम में से किसी ने कभी सोचा था कि एक दिन हम एमएस कोड और प्रथाओं के सवाल पूछेंगे और जवाब होगा, "बस उनके कोडबेस पर एक नज़र डालें?"
मार्क एल।

3
बाद में आने वाले अन्य लोगों के लिए, आपके नामस्थान के AuthExtensionअंदर होना चाहिए Microsoft.Extensions.DependencyInjection। इस उदाहरण को देखें: github.com/aspnet/Security/blob/rel/2.0.0/src/…
गैरी पोली

4

आपके द्वारा इंगित किए गए लेख के रूप में Core 1.x से Core 2.0 तक पहचान में काफी बदलाव हैं। कस्टम सेवाओं को कॉन्फ़िगर करने के लिए प्रमुख परिवर्तन मिडलवेयर दृष्टिकोण से दूर हो रहा है और निर्भरता इंजेक्शन का उपयोग कर रहा है। यह अधिक जटिल कार्यान्वयन के लिए पहचान को अनुकूलित करने में बहुत अधिक लचीलापन प्रदान करता है। इसलिए आप ऊपर बताए गए मिडलवेयर दृष्टिकोण से दूर जाना चाहते हैं और सेवाओं की ओर बढ़ते हैं। इस लक्ष्य को प्राप्त करने के लिए संदर्भित लेख में माइग्रेशन चरणों का पालन करें। App.UseIdentity को app.UseAuthentication के स्थान पर प्रारंभ करें । उपयोगिता का मूल्यह्रास किया जाता है और भविष्य के संस्करणों में इसका समर्थन नहीं किया जाएगा। कस्टम दावा परिवर्तन सम्मिलित करने और दावे पर प्राधिकरण करने के तरीके का एक पूरा उदाहरण के लिएइस ब्लॉग पोस्ट को देखें


12
क्या वेबएपीआई ऐप के साथ इसका उपयोग करने का कोई उदाहरण है?
एलेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.