ASP.NET कोर में टोकन आधारित प्रमाणीकरण


161

मैं ASP.NET कोर एप्लिकेशन के साथ काम कर रहा हूं। मैं टोकन आधारित प्रमाणीकरण को लागू करने की कोशिश कर रहा हूं, लेकिन यह पता नहीं लगा सकता कि मेरे मामले के लिए नई सुरक्षा प्रणाली का उपयोग कैसे किया जाए । मैं उदाहरणों के माध्यम से गया था, लेकिन उन्होंने मुझे बहुत मदद नहीं की, वे कुकी प्रमाणीकरण या बाहरी प्रमाणीकरण (GitHub, Microsoft, Twitter) का उपयोग कर रहे हैं।

मेरा परिदृश्य क्या है: angularjs आवेदन को /tokenurl पास करने वाले उपयोगकर्ता नाम और पासवर्ड का अनुरोध करना चाहिए । WebApi को उपयोगकर्ता को अधिकृत करना चाहिए और वापस भेजना चाहिए access_tokenजो निम्नलिखित अनुरोधों में angularjs ऐप द्वारा उपयोग किया जाएगा।

मुझे ASP.NET के वर्तमान संस्करण में ठीक वैसा ही लागू करने के बारे में बहुत अच्छा लेख मिला है - ASP.NET वेब एपीआई 2, ओविन और आइडेंटिटी का उपयोग करके टोकन आधारित प्रमाणीकरण । लेकिन मेरे लिए यह स्पष्ट नहीं है कि ASP.NET Core में वही काम कैसे किया जाए।

मेरा सवाल है: टोकन आधारित प्रमाणीकरण के साथ काम करने के लिए ASP.NET Core WebApi एप्लिकेशन को कैसे कॉन्फ़िगर किया जाए?


मेरे पास एक ही मुद्दा है और मैं यह सब करने की योजना बना रहा था, खुद FYI करें, एक और सवाल है stackoverflow.com/questions/29055477/… लेकिन अभी तक कोई आंसर-की नहीं है, देखते हैं क्या होता है
Son_of_Sam


मैं भी इसी मुद्दे का सामना कर रहा हूं, लेकिन अभी तक कोई समाधान नहीं खोज सका ... मुझे एक अन्य सेवा का उपयोग करके एक कस्टम प्रमाणीकरण लिखने की आवश्यकता है जो मेरे टोकन को प्रमाणित करता है।
मयंक गुप्ता

जवाबों:


137

.Net Core 3.1 के लिए अपडेट करें:

डेविड फॉलर (एएसपी .NET कोर टीम के लिए वास्तुकार) ने डब्ल्यूडब्ल्यूटी का प्रदर्शन करने वाले एक साधारण आवेदन सहित, एक अविश्वसनीय रूप से सरल कार्य कार्यों को एक साथ रखा है । मैं जल्द ही इस पोस्ट के लिए अपने अपडेट और सरलीकृत शैली को शामिल करूंगा।

.Net कोर 2 के लिए अपडेट किया गया:

इस उत्तर के पिछले संस्करणों में आरएसए का उपयोग किया गया था; यह वास्तव में आवश्यक नहीं है यदि आपका वही कोड जो टोकन उत्पन्न कर रहा है, वह टोकन को भी सत्यापित कर रहा है। हालाँकि, यदि आप जिम्मेदारी का वितरण कर रहे हैं, तो आप शायद अभी भी इसका एक उदाहरण का उपयोग करके करना चाहते हैं Microsoft.IdentityModel.Tokens.RsaSecurityKey

  1. कुछ स्थिरांक बनाएं जिन्हें हम बाद में उपयोग करेंगे; यहाँ मैंने क्या किया:

    const string TokenAudience = "Myself";
    const string TokenIssuer = "MyProject";
    
  2. इसे अपने Startup.cs में जोड़ें ConfigureServices। हम इन सेटिंग्स तक पहुंचने के लिए बाद में निर्भरता इंजेक्शन का उपयोग करेंगे। मैं मान रहा हूं कि आपकी authenticationConfigurationएक ConfigurationSectionया Configurationवस्तु ऐसी है कि आप डिबग और प्रोडक्शन के लिए एक अलग कॉन्फिगर कर सकते हैं। सुनिश्चित करें कि आप अपनी कुंजी सुरक्षित रूप से संग्रहीत करते हैं! यह कोई भी तार हो सकता है।

    var keySecret = authenticationConfiguration["JwtSigningKey"];
    var symmetricKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(keySecret));
    
    services.AddTransient(_ => new JwtSignInHandler(symmetricKey));
    
    services.AddAuthentication(options =>
    {
        // This causes the default authentication scheme to be JWT.
        // Without this, the Authorization header is not checked and
        // you'll get no results. However, this also means that if
        // you're already using cookies in your app, they won't be 
        // checked by default.
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    })
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters.ValidateIssuerSigningKey = true;
            options.TokenValidationParameters.IssuerSigningKey = symmetricKey;
            options.TokenValidationParameters.ValidAudience = JwtSignInHandler.TokenAudience;
            options.TokenValidationParameters.ValidIssuer = JwtSignInHandler.TokenIssuer;
        });
    

    मैंने अन्य उत्तर बदल कर अन्य सेटिंग्स देखी हैं, जैसे ClockSkew; डिफॉल्ट्स को ऐसे सेट किया जाता है कि इसे वितरित वातावरण के लिए काम करना चाहिए, जिनकी घड़ियों बिल्कुल सिंक में नहीं हैं। ये एकमात्र सेटिंग हैं जिन्हें आपको बदलने की आवश्यकता है।

  3. प्रमाणीकरण स्थापित करें। आपके पास किसी भी मिडलवेयर से पहले यह लाइन होनी चाहिए, जिसे आपकी Userजानकारी की आवश्यकता हो , जैसे कि app.UseMvc()

    app.UseAuthentication();

    ध्यान दें कि इससे आपका टोकन SignInManagerया कुछ और के साथ उत्सर्जित नहीं होगा। आपको अपने JWT के आउटपुट के लिए अपना स्वयं का तंत्र प्रदान करना होगा - नीचे देखें।

  4. आप एक निर्दिष्ट करना चाह सकते हैं AuthorizationPolicy। यह आपको नियंत्रकों और कार्यों को निर्दिष्ट करने की अनुमति देगा जो केवल बियरर टोकन को प्रमाणीकरण के रूप में उपयोग करने की अनुमति देते हैं [Authorize("Bearer")]

    services.AddAuthorization(auth =>
    {
        auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
            .AddAuthenticationTypes(JwtBearerDefaults.AuthenticationType)
            .RequireAuthenticatedUser().Build());
    });
    
  5. यहाँ मुश्किल हिस्सा आता है: टोकन का निर्माण।

    class JwtSignInHandler
    {
        public const string TokenAudience = "Myself";
        public const string TokenIssuer = "MyProject";
        private readonly SymmetricSecurityKey key;
    
        public JwtSignInHandler(SymmetricSecurityKey symmetricKey)
        {
            this.key = symmetricKey;
        }
    
        public string BuildJwt(ClaimsPrincipal principal)
        {
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    
            var token = new JwtSecurityToken(
                issuer: TokenIssuer,
                audience: TokenAudience,
                claims: principal.Claims,
                expires: DateTime.Now.AddMinutes(20),
                signingCredentials: creds
            );
    
            return new JwtSecurityTokenHandler().WriteToken(token);
        }
    }
    

    फिर, अपने कंट्रोलर में, जहाँ आप अपना टोकन चाहते हैं, कुछ इस तरह है:

    [HttpPost]
    public string AnonymousSignIn([FromServices] JwtSignInHandler tokenFactory)
    {
        var principal = new System.Security.Claims.ClaimsPrincipal(new[]
        {
            new System.Security.Claims.ClaimsIdentity(new[]
            {
                new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Name, "Demo User")
            })
        });
        return tokenFactory.BuildJwt(principal);
    }
    

    यहाँ, मैं आपको पहले से ही एक प्रिंसिपल मान रहा हूँ। यदि आप पहचान का उपयोग कर रहे हैं, तो आप IUserClaimsPrincipalFactory<>अपने Userको एक में बदलने के लिए उपयोग कर सकते हैं ClaimsPrincipal

  6. इसे जांचने के लिए : एक टोकन प्राप्त करें, इसे jwt.io पर फॉर्म में डालें । मेरे द्वारा ऊपर दिए गए निर्देश भी आपको हस्ताक्षर को मान्य करने के लिए अपने कॉन्फ़िगर से रहस्य का उपयोग करने की अनुमति देते हैं!

  7. यदि आप इसे अपने HTML पृष्ठ पर आंशिक रूप से .net 4.5 में बियरर-ओनली ऑथेंटिकेशन के साथ संयोजन में दे रहे थे, तो अब आप इसे ViewComponentकरने के लिए उपयोग कर सकते हैं । यह ऊपर के कंट्रोलर एक्शन कोड के समान है।


1
आपको IOptions<OAuthBearerAuthenticationOptions>विकल्प का उपयोग करने के लिए वास्तव में इंजेक्शन लगाने की आवश्यकता होगी ; एक विकल्प ऑब्जेक्ट का उपयोग करके सीधे नामांकित कॉन्फ़िगरेशन के कारण समर्थित नहीं है जो विकल्प मॉडल फ्रेमवर्क द्वारा समर्थित है।
मैट डेक्रे

2
मैं जो उपयोग कर रहा हूं, उसे अपडेट किया गया है, हालांकि अब उत्तर को फिर से लिखना चाहिए। मेरा प्रहार करने के लिए धन्यवाद!
मैट डीके

5
# 5 तब से Microsoft.AspNet.Authentication.OAuthBearer - बीटा 5 - 6 में निम्नलिखित को बदल दिया गया है और संभवत: पहले betas है, लेकिन उन लोगों की पुष्टि नहीं की है। ऑर्टा। एडिपोलिसी ("बियरर", नया ऑथराइजेशनपॉलिसिबल () (.AddAuthenticationSchemes) (OAuthBearerAuthenticationDefaults.AuthenticationScheme) .RireireAuthenticatedUser () बिल्ड) ();
डायनमलिनक

5
@MattDeKrey मैंने इस उत्तर को साधारण टोकन आधारित सिद्धांत के उदाहरण के लिए एक शुरुआती बिंदु के रूप में उपयोग किया है, और इसे बीटा 7 के खिलाफ काम करने के लिए अद्यतन किया है - github.com/mrsheepuk/ASPNETSelfCreatedToken.uthExample देखें - इन टिप्पणियों में से कुछ बिंदुओं को भी शामिल किया गया है।
मार्क ह्यूजेस

2
RC1 के लिए फिर से अपडेट किया गया - बीटा 7 और बीटा 8 के पुराने संस्करण GitHub पर शाखाओं में उपलब्ध हैं।
मार्क ह्यूजेस

83

मैट डेकेरे के शानदार जवाब से काम करते हुए , मैंने टोकन-आधारित प्रमाणीकरण का एक पूरी तरह से काम करने वाला उदाहरण बनाया है, ASP.NET Core (1.0.1) के खिलाफ काम कर रहा है। आप इस रिपॉजिटरी में GitHub ( 1.0.0-rc1 , Beta8 , beta7 के लिए वैकल्पिक शाखाएं) पर पूर्ण कोड पा सकते हैं , लेकिन संक्षेप में, महत्वपूर्ण चरण हैं:

अपने एप्लिकेशन के लिए एक कुंजी बनाएं

मेरे उदाहरण में, मैं एप्लिकेशन शुरू होने पर हर बार एक यादृच्छिक कुंजी उत्पन्न करता हूं, आपको एक को उत्पन्न करना होगा और इसे कहीं स्टोर करना होगा और इसे अपने एप्लिकेशन को प्रदान करना होगा। इस फ़ाइल को देखें कि मैं एक यादृच्छिक कुंजी कैसे बना रहा हूँ और आप इसे एक .json फ़ाइल से कैसे आयात कर सकते हैं । जैसा कि @kspearrin द्वारा टिप्पणियों में सुझाया गया है, डेटा सुरक्षा एपीआई कुंजी को "सही ढंग से" प्रबंधित करने के लिए एक आदर्श उम्मीदवार की तरह लगता है, लेकिन मैंने अभी तक संभव नहीं होने पर काम नहीं किया है। यदि आप इसे काम करते हैं तो कृपया एक अनुरोध भेजें!

Startup.cs - कॉन्फ़िगर करें सेवाएँ

यहां, हमें अपने टोकन के साथ एक निजी कुंजी लोड करने की आवश्यकता है, जिसके साथ हम टोकन को सत्यापित करने के लिए भी उपयोग करेंगे, जैसा कि उन्हें प्रस्तुत किया गया है। हम कुंजी को एक वर्ग-स्तरीय चर में संग्रहीत कर रहे हैं keyजिसे हम नीचे कॉन्फ़िगर विधि में फिर से उपयोग करेंगे। TokenAuthOptions एक साधारण वर्ग है जो हस्ताक्षरित पहचान, ऑडियंस और जारीकर्ता रखता है, जिसे हमें अपनी कुंजी बनाने के लिए TokenController में आवश्यकता होगी।

// Replace this with some sort of loading from config / file.
RSAParameters keyParams = RSAKeyUtils.GetRandomKey();

// Create the key, and a set of token options to record signing credentials 
// using that key, along with the other parameters we will need in the 
// token controlller.
key = new RsaSecurityKey(keyParams);
tokenOptions = new TokenAuthOptions()
{
    Audience = TokenAudience,
    Issuer = TokenIssuer,
    SigningCredentials = new SigningCredentials(key, SecurityAlgorithms.Sha256Digest)
};

// Save the token options into an instance so they're accessible to the 
// controller.
services.AddSingleton<TokenAuthOptions>(tokenOptions);

// Enable the use of an [Authorize("Bearer")] attribute on methods and
// classes to protect.
services.AddAuthorization(auth =>
{
    auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
        .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme‌​)
        .RequireAuthenticatedUser().Build());
});

हमने एक प्राधिकरण नीति भी स्थापित की है जिससे हम [Authorize("Bearer")]उन समापन बिंदुओं और कक्षाओं का उपयोग कर सकें जिनकी हम रक्षा करना चाहते हैं।

Startup.cs - कॉन्फ़िगर करें

यहां, हमें JwtBearerAuthentication को कॉन्फ़िगर करने की आवश्यकता है:

app.UseJwtBearerAuthentication(new JwtBearerOptions {
    TokenValidationParameters = new TokenValidationParameters {
        IssuerSigningKey = key,
        ValidAudience = tokenOptions.Audience,
        ValidIssuer = tokenOptions.Issuer,

        // When receiving a token, check that it is still valid.
        ValidateLifetime = true,

        // This defines the maximum allowable clock skew - i.e.
        // provides a tolerance on the token expiry time 
        // when validating the lifetime. As we're creating the tokens 
        // locally and validating them on the same machines which 
        // should have synchronised time, this can be set to zero. 
        // Where external tokens are used, some leeway here could be 
        // useful.
        ClockSkew = TimeSpan.FromMinutes(0)
    }
});

TokenController

टोकन नियंत्रक में, आपको साइनअप करने वाली कुंजी का उपयोग करने के लिए एक विधि की आवश्यकता होती है जो कि स्टार्टअप.क्स में लोड की गई थी। हमने स्टार्टअप में एक टोकनएथ्यूशंस उदाहरण दर्ज किया है, इसलिए हमें टोकनकेन्ट्रोलर के लिए कंस्ट्रक्टर में इसे इंजेक्ट करने की आवश्यकता है:

[Route("api/[controller]")]
public class TokenController : Controller
{
    private readonly TokenAuthOptions tokenOptions;

    public TokenController(TokenAuthOptions tokenOptions)
    {
        this.tokenOptions = tokenOptions;
    }
...

फिर आपको लॉगिन एंडपॉइंट के लिए अपने हैंडलर में टोकन जेनरेट करना होगा, मेरे उदाहरण में मैं एक यूजरनेम और पासवर्ड ले रहा हूं और अगर एक स्टेटमेंट का उपयोग करने वालों को मान्य कर रहा है, लेकिन आपको एक दावा बनाने या लोड करने की आवश्यकता है पहचान-आधारित पहचान और उसके लिए टोकन उत्पन्न करना:

public class AuthRequest
{
    public string username { get; set; }
    public string password { get; set; }
}

/// <summary>
/// Request a new token for a given username/password pair.
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
[HttpPost]
public dynamic Post([FromBody] AuthRequest req)
{
    // Obviously, at this point you need to validate the username and password against whatever system you wish.
    if ((req.username == "TEST" && req.password == "TEST") || (req.username == "TEST2" && req.password == "TEST"))
    {
        DateTime? expires = DateTime.UtcNow.AddMinutes(2);
        var token = GetToken(req.username, expires);
        return new { authenticated = true, entityId = 1, token = token, tokenExpires = expires };
    }
    return new { authenticated = false };
}

private string GetToken(string user, DateTime? expires)
{
    var handler = new JwtSecurityTokenHandler();

    // Here, you should create or look up an identity for the user which is being authenticated.
    // For now, just creating a simple generic identity.
    ClaimsIdentity identity = new ClaimsIdentity(new GenericIdentity(user, "TokenAuth"), new[] { new Claim("EntityID", "1", ClaimValueTypes.Integer) });

    var securityToken = handler.CreateToken(new Microsoft.IdentityModel.Tokens.SecurityTokenDescriptor() {
        Issuer = tokenOptions.Issuer,
        Audience = tokenOptions.Audience,
        SigningCredentials = tokenOptions.SigningCredentials,
        Subject = identity,
        Expires = expires
    });
    return handler.WriteToken(securityToken);
}

और यही होना चाहिए। जिस [Authorize("Bearer")]भी विधि या वर्ग को आप संरक्षित करना चाहते हैं, उसमें बस जोड़ें , और यदि आपको टोकन के बिना इसे एक्सेस करने का प्रयास करना है, तो आपको एक त्रुटि मिलनी चाहिए। यदि आप 500 त्रुटि के बजाय 401 को वापस करना चाहते हैं, तो आपको एक कस्टम अपवाद हैंडलर को पंजीकृत करना होगा, जैसा कि मेरे उदाहरण में मेरे पास है


1
यह वास्तव में उत्कृष्ट उदाहरण है, और इसमें सभी लापता टुकड़ों को शामिल करने की आवश्यकता है जो मुझे काम करने के लिए @ मैटडेक्रे का उदाहरण प्राप्त करने के लिए बहुत बहुत धन्यवाद! ध्यान दें कि बीटा 8 के बजाय बीटा 7 को लक्षित करने वाला कोई भी अभी भी जीथब इतिहास
निकस्पून

1
खुशी है कि यह @nickspoon में मदद करता है - अगर आपको इसके साथ कोई समस्या है, तो मुझे बताएं या जीथब पर एक पुल अनुरोध में पॉप करें और मैं अपडेट कर दूंगा!
मार्क ह्यूजेस

2
इसके लिए धन्यवाद, हालांकि मुझे यह समझ में नहीं आया कि ASP.Net 4 वेब एपीआई में बॉक्स से बाहर काम करने वाली चीज़ों को अब ASP.Net में बहुत थोड़ा कॉन्फ़िगरेशन की आवश्यकता है। 5. एक कदम पीछे की तरह लगता है।
JMK

1
मुझे लगता है कि वे ASP.NET 5 के लिए वास्तव में "सामाजिक नीति" को आगे बढ़ा रहे हैं, जिसका कुछ अर्थ मुझे लगता है, लेकिन ऐसे अनुप्रयोग हैं जो उचित नहीं हैं इसलिए मुझे यकीन नहीं है कि मैं उनकी दिशा से सहमत हूं @JMK
मार्क ह्यूजेस

1
@YuriyP मुझे RC2 के लिए इस उत्तर को अपडेट करने की आवश्यकता है - मैंने हमारे आंतरिक ऐप को अपडेट नहीं किया है जो RC2 के लिए इसका उपयोग करता है, फिर भी मुझे यकीन नहीं है कि इसमें क्या शामिल है। एक बार जब मैंने अंतर पर काम कर लिया, तो मैं अपडेट करूंगा ...
मार्क ह्यूजेस

3

आप OpenId कनेक्ट सैंपल पर एक नज़र डाल सकते हैं जो बताता है कि JWT टोकन सहित विभिन्न प्रमाणीकरण तंत्रों से कैसे निपटा जाए:

https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Samples

यदि आप कॉर्डोवा बैकएंड प्रोजेक्ट को देखते हैं, तो एपीआई के लिए कॉन्फ़िगरेशन इस प्रकार है:

           // Create a new branch where the registered middleware will be executed only for non API calls.
        app.UseWhen(context => !context.Request.Path.StartsWithSegments(new PathString("/api")), branch => {
            // Insert a new cookies middleware in the pipeline to store
            // the user identity returned by the external identity provider.
            branch.UseCookieAuthentication(new CookieAuthenticationOptions {
                AutomaticAuthenticate = true,
                AutomaticChallenge = true,
                AuthenticationScheme = "ServerCookie",
                CookieName = CookieAuthenticationDefaults.CookiePrefix + "ServerCookie",
                ExpireTimeSpan = TimeSpan.FromMinutes(5),
                LoginPath = new PathString("/signin"),
                LogoutPath = new PathString("/signout")
            });

            branch.UseGoogleAuthentication(new GoogleOptions {
                ClientId = "560027070069-37ldt4kfuohhu3m495hk2j4pjp92d382.apps.googleusercontent.com",
                ClientSecret = "n2Q-GEw9RQjzcRbU3qhfTj8f"
            });

            branch.UseTwitterAuthentication(new TwitterOptions {
                ConsumerKey = "6XaCTaLbMqfj6ww3zvZ5g",
                ConsumerSecret = "Il2eFzGIrYhz6BWjYhVXBPQSfZuS4xoHpSSyD9PI"
            });
        });

/Providers/AuthorizationProvider.cs और उस परियोजना के RessourceController में तर्क भी देखने लायक हैं;)।

वैकल्पिक रूप से आप टोकन को मान्य करने के लिए निम्न कोड का भी उपयोग कर सकते हैं (सिग्नलआर के साथ इसे काम करने के लिए एक स्निपेट भी है):

        // Add a new middleware validating access tokens.
        app.UseOAuthValidation(options =>
        {
            // Automatic authentication must be enabled
            // for SignalR to receive the access token.
            options.AutomaticAuthenticate = true;

            options.Events = new OAuthValidationEvents
            {
                // Note: for SignalR connections, the default Authorization header does not work,
                // because the WebSockets JS API doesn't allow setting custom parameters.
                // To work around this limitation, the access token is retrieved from the query string.
                OnRetrieveToken = context =>
                {
                    // Note: when the token is missing from the query string,
                    // context.Token is null and the JWT bearer middleware will
                    // automatically try to retrieve it from the Authorization header.
                    context.Token = context.Request.Query["access_token"];

                    return Task.FromResult(0);
                }
            };
        });

टोकन जारी करने के लिए आप इस तरह से OpenId कनेक्ट सर्वर पैकेज का उपयोग कर सकते हैं:

        // Add a new middleware issuing access tokens.
        app.UseOpenIdConnectServer(options =>
        {
            options.Provider = new AuthenticationProvider();
            // Enable the authorization, logout, token and userinfo endpoints.
            //options.AuthorizationEndpointPath = "/connect/authorize";
            //options.LogoutEndpointPath = "/connect/logout";
            options.TokenEndpointPath = "/connect/token";
            //options.UserinfoEndpointPath = "/connect/userinfo";

            // Note: if you don't explicitly register a signing key, one is automatically generated and
            // persisted on the disk. If the key cannot be persisted, an exception is thrown.
            // 
            // On production, using a X.509 certificate stored in the machine store is recommended.
            // You can generate a self-signed certificate using Pluralsight's self-cert utility:
            // https://s3.amazonaws.com/pluralsight-free/keith-brown/samples/SelfCert.zip
            // 
            // options.SigningCredentials.AddCertificate("7D2A741FE34CC2C7369237A5F2078988E17A6A75");
            // 
            // Alternatively, you can also store the certificate as an embedded .pfx resource
            // directly in this assembly or in a file published alongside this project:
            // 
            // options.SigningCredentials.AddCertificate(
            //     assembly: typeof(Startup).GetTypeInfo().Assembly,
            //     resource: "Nancy.Server.Certificate.pfx",
            //     password: "Owin.Security.OpenIdConnect.Server");

            // Note: see AuthorizationController.cs for more
            // information concerning ApplicationCanDisplayErrors.
            options.ApplicationCanDisplayErrors = true // in dev only ...;
            options.AllowInsecureHttp = true // in dev only...;
        });

संपादित करें: मैंने औरेलिया फ्रंट एंड फ्रेमवर्क और ASP.NET कोर का उपयोग करके टोकन आधारित प्रमाणीकरण कार्यान्वयन के साथ एक पेज का आवेदन लागू किया है। एक संकेत R लगातार कनेक्शन भी है। हालाँकि मैंने कोई DB कार्यान्वयन नहीं किया है। कोड यहाँ देखा जा सकता है: https://github.com/alexandre-spieser/AureliaAspNetCoreAuth

उम्मीद है की यह मदद करेगा,

श्रेष्ठ,

एलेक्स


1

OpenIddict पर एक नज़र डालें - यह एक नई परियोजना है (लेखन के समय) जो JWT टोकन के निर्माण को कॉन्फ़िगर करने और ASP.NET में ताज़ा ताज़ा करने के लिए आसान बनाता है। 5. टोकन की मान्यता को अन्य सॉफ़्टवेयर द्वारा नियंत्रित किया जाता है।

मान लें कि आप के Identityसाथ उपयोग करते हैं Entity Framework, तो अंतिम पंक्ति वह है जो आप अपने ConfigureServicesतरीके से जोड़ेंगे :

services.AddIdentity<ApplicationUser, ApplicationRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders()
    .AddOpenIddictCore<Application>(config => config.UseEntityFramework());

में Configure, आप जेडब्ल्यूटी टोकन सेवा करने के लिए OpenIddict की स्थापना:

app.UseOpenIddictCore(builder =>
{
    // tell openiddict you're wanting to use jwt tokens
    builder.Options.UseJwtTokens();
    // NOTE: for dev consumption only! for live, this is not encouraged!
    builder.Options.AllowInsecureHttp = true;
    builder.Options.ApplicationCanDisplayErrors = true;
});

आप टोकन के सत्यापन को भी कॉन्फ़िगर करते हैं Configure:

// use jwt bearer authentication
app.UseJwtBearerAuthentication(options =>
{
    options.AutomaticAuthenticate = true;
    options.AutomaticChallenge = true;
    options.RequireHttpsMetadata = false;
    options.Audience = "http://localhost:58292/";
    options.Authority = "http://localhost:58292/";
});

एक या दो अन्य छोटी चीजें हैं, जैसे कि आपके DbContext को OpenIddictContext से प्राप्त करना होगा।

आप इस ब्लॉग पोस्ट पर एक पूरी लंबाई की व्याख्या देख सकते हैं: http://capesean.co.za/blog/asp-net-5-jwt-bokens/

एक कामकाजी डेमो यहां उपलब्ध है: https://github.com/oidsean/openiddict-test

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