ASP.NET वेब एपीआई के लिए JWT प्रमाणीकरण


264

मैं अपने वेब एपीआई एप्लिकेशन में JWT बियरर टोकन (JSON वेब टोकन) का समर्थन करने की कोशिश कर रहा हूं और मैं खो रहा हूं।

मैं .NET कोर और OWIN अनुप्रयोगों के लिए समर्थन देखता हूं।
मैं वर्तमान में IIS में अपना एप्लिकेशन होस्ट कर रहा हूं।

मैं अपने आवेदन में इस प्रमाणीकरण मॉड्यूल को कैसे प्राप्त कर सकता हूं? क्या कोई तरीका है कि मैं <authentication>कॉन्फ़िगरेशन का उपयोग उसी तरह कर सकता हूं जैसे मैं फॉर्म / विंडोज प्रमाणीकरण का उपयोग करता हूं?

जवाबों:


611

मैंने इस सवाल का जवाब दिया: कैसे एक ASP.NET वेब एपीआई को 4 साल पहले एचएमएसी का उपयोग करके सुरक्षित किया जाए

अब, सुरक्षा में बहुत सारी चीजें बदल गईं, खासकर JWT लोकप्रिय हो रही है। यहाँ, मैं यह समझाने की कोशिश करूँगा कि JWT को सबसे सरल और बुनियादी तरीके से कैसे उपयोग किया जा सकता है, जिससे हम OWIN, Oauth2, ASP.NET आइडेंटिटी ... के जंगल से नहीं हटेंगे ... :)।

यदि आप JWT टोकन नहीं जानते हैं, तो आपको थोड़ा सा देखने की आवश्यकता है:

https://tools.ietf.org/html/rfc7519

मूल रूप से, JWT टोकन जैसा दिखता है:

<base64-encoded header>.<base64-encoded claims>.<base64-encoded signature>

उदाहरण:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImN1b25nIiwibmJmIjoxNDc3NTY1NzI0LCJleHAiOjE0Nzc1NjY5MjQsImlhdCI6MTQ3NzU2NTcyNH0.6MzD1VwA5AcOcajkFyKhLYybr3h13iZjDyHm9zysDFQ

JWT टोकन में तीन खंड होते हैं:

  1. हैडर: JSON प्रारूप जो कि बेस 64 में एन्कोड किया गया है
  2. दावे: JSON प्रारूप जो Base64 में एन्कोडेड है।
  3. हस्ताक्षर: हैडर और दावों के आधार पर बनाया और हस्ताक्षरित किया गया है जो बेस 64 में एन्कोडेड है।

यदि आप ऊपर टोकन के साथ वेबसाइट jwt.io का उपयोग करते हैं , तो आप टोकन को डीकोड कर सकते हैं और इसे नीचे देख सकते हैं:

यहां छवि विवरण दर्ज करें

तकनीकी रूप से, JWT हस्ताक्षर का उपयोग करता है जो हेडर से हस्ताक्षरित है और हेडर में निर्दिष्ट सुरक्षा एल्गोरिथ्म के साथ दावा करता है (उदाहरण: HMACSHA256)। इसलिए, यदि आप दावों में कोई संवेदनशील जानकारी संग्रहीत करते हैं, तो JWT को HTTP पर स्थानांतरित किया जाना आवश्यक है।

JWT प्रमाणीकरण का उपयोग करने के लिए, यदि आपके पास विरासत वेब एप प्रणाली है, तो आपको वास्तव में OWIN मिडलवेयर की आवश्यकता नहीं है। सरल अवधारणा यह है कि JWT टोकन कैसे प्रदान किया जाए और अनुरोध आने पर टोकन को कैसे मान्य किया जाए। बस।

डेमो में वापस, जेडब्ल्यूटी टोकन को हल्का रखने के लिए, मैं केवल स्टोर करता हूं usernameऔर expiration timeजेडब्ल्यूटी में। लेकिन इस तरह, आपको और अधिक जानकारी जोड़ने के लिए नई स्थानीय पहचान (प्रिंसिपल) का निर्माण करना होगा: भूमिकाएँ .. यदि आप भूमिका प्राधिकरण करना चाहते हैं। लेकिन, यदि आप JWT में अधिक जानकारी जोड़ना चाहते हैं, तो यह आपके ऊपर है: यह बहुत लचीला है।

OWIN मिडलवेयर का उपयोग करने के बजाय, आप नियंत्रक से कार्रवाई का उपयोग करके केवल JWT टोकन समापन बिंदु प्रदान कर सकते हैं:

public class TokenController : ApiController
{
    // This is naive endpoint for demo, it should use Basic authentication
    // to provide token or POST request
    [AllowAnonymous]
    public string Get(string username, string password)
    {
        if (CheckUser(username, password))
        {
            return JwtManager.GenerateToken(username);
        }

        throw new HttpResponseException(HttpStatusCode.Unauthorized);
    }

    public bool CheckUser(string username, string password)
    {
        // should check in the database
        return true;
    }
}

यह एक भोली क्रिया है; उत्पादन में आपको JWT टोकन प्रदान करने के लिए एक POST अनुरोध या एक मूल प्रमाणीकरण समापन बिंदु का उपयोग करना चाहिए।

टोकन के आधार पर कैसे उत्पन्न करें username?

System.IdentityModel.Tokens.Jwtयदि आप चाहें तो टोकन बनाने के लिए आप Microsoft से बुलाए गए NuGet पैकेज या किसी अन्य पैकेज का उपयोग कर सकते हैं। डेमो में, मैं इसके HMACSHA256साथ उपयोग करता हूं SymmetricKey:

/// <summary>
/// Use the below code to generate symmetric Secret Key
///     var hmac = new HMACSHA256();
///     var key = Convert.ToBase64String(hmac.Key);
/// </summary>
private const string Secret = "db3OIsj+BXE9NZDy0t8W3TcNekrF+2d/1sFnWG4HnV8TZY30iTOdtVWJG8abWvB1GlOgJuQZdcF2Luqm/hccMw==";

public static string GenerateToken(string username, int expireMinutes = 20)
{
    var symmetricKey = Convert.FromBase64String(Secret);
    var tokenHandler = new JwtSecurityTokenHandler();

    var now = DateTime.UtcNow;
    var tokenDescriptor = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(new[]
        {
            new Claim(ClaimTypes.Name, username)
        }),

        Expires = now.AddMinutes(Convert.ToInt32(expireMinutes)),

        SigningCredentials = new SigningCredentials(
            new SymmetricSecurityKey(symmetricKey), 
            SecurityAlgorithms.HmacSha256Signature)
    };

    var stoken = tokenHandler.CreateToken(tokenDescriptor);
    var token = tokenHandler.WriteToken(stoken);

    return token;
}

JWT टोकन प्रदान करने के लिए समापन बिंदु किया गया है। अब, अनुरोध आने पर JWT को कैसे मान्य किया जाए? डेमो में मैंने बनाया है JwtAuthenticationAttributeजो इनहेरिट करता है IAuthenticationFilter(प्रमाणीकरण फिल्टर के बारे में अधिक विवरण यहां से )।

इस विशेषता के साथ, आप किसी भी कार्रवाई को प्रमाणित कर सकते हैं: आपको इस विशेषता को उस कार्रवाई पर रखना होगा।

public class ValueController : ApiController
{
    [JwtAuthentication]
    public string Get()
    {
        return "value";
    }
}

यदि आप अपने WebAPI के लिए सभी आवक अनुरोधों को मान्य करना चाहते हैं (नियंत्रक या कार्रवाई के लिए विशिष्ट नहीं) तो आप OWIN मिडलवेयर या डेलिगेटहैंडर का उपयोग कर सकते हैं।

नीचे प्रमाणीकरण फिल्टर से मुख्य विधि है:

private static bool ValidateToken(string token, out string username)
{
    username = null;

    var simplePrinciple = JwtManager.GetPrincipal(token);
    var identity = simplePrinciple.Identity as ClaimsIdentity;

    if (identity == null)
        return false;

    if (!identity.IsAuthenticated)
        return false;

    var usernameClaim = identity.FindFirst(ClaimTypes.Name);
    username = usernameClaim?.Value;

    if (string.IsNullOrEmpty(username))
       return false;

    // More validate to check whether username exists in system

    return true;
}

protected Task<IPrincipal> AuthenticateJwtToken(string token)
{
    string username;

    if (ValidateToken(token, out username))
    {
        // based on username to get more information from database 
        // in order to build local identity
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, username)
            // Add more claims if needed: Roles, ...
        };

        var identity = new ClaimsIdentity(claims, "Jwt");
        IPrincipal user = new ClaimsPrincipal(identity);

        return Task.FromResult(user);
    }

    return Task.FromResult<IPrincipal>(null);
}

JWT टोकन को मान्य करने और फिर वापस लौटने के लिए वर्कफ़्लो JWT लाइब्रेरी (उपरोक्त नूगेट पैकेज) का उपयोग कर रहा है ClaimsPrincipal। आप यह जाँच सकते हैं कि उपयोगकर्ता आपके सिस्टम पर मौजूद है या नहीं और यदि आप चाहें तो अन्य कस्टम सत्यापन जोड़ सकते हैं। जेडब्ल्यूटी टोकन को मान्य करने और प्रिंसिपल वापस पाने के लिए कोड:

public static ClaimsPrincipal GetPrincipal(string token)
{
    try
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var jwtToken = tokenHandler.ReadToken(token) as JwtSecurityToken;

        if (jwtToken == null)
            return null;

        var symmetricKey = Convert.FromBase64String(Secret);

        var validationParameters = new TokenValidationParameters()
        {
            RequireExpirationTime = true,
            ValidateIssuer = false,
            ValidateAudience = false,
            IssuerSigningKey = new SymmetricSecurityKey(symmetricKey)
        };

        SecurityToken securityToken;
        var principal = tokenHandler.ValidateToken(token, validationParameters, out securityToken);

        return principal;
    }
    catch (Exception)
    {
        //should write log
        return null;
    }
}

यदि JWT टोकन को मान्य किया गया है और मूलधन वापस आ गया है, तो आपको एक नई स्थानीय पहचान बनानी चाहिए और भूमिका प्राधिकरण की जांच करने के लिए इसमें और जानकारी डालनी चाहिए।

config.Filters.Add(new AuthorizeAttribute());अपने संसाधनों के लिए किसी भी अनाम अनुरोध को रोकने के लिए वैश्विक दायरे में (डिफ़ॉल्ट प्राधिकरण) जोड़ना याद रखें ।

डेमो का परीक्षण करने के लिए आप पोस्टमैन का उपयोग कर सकते हैं:

टोकन का अनुरोध करें (जैसा कि मैंने ऊपर बताया है, बस डेमो के लिए):

GET http://localhost:{port}/api/token?username=cuong&password=1

अधिकृत अनुरोध के लिए हेडर में JWT टोकन डालें, उदाहरण:

GET http://localhost:{port}/api/value

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImN1b25nIiwibmJmIjoxNDc3NTY1MjU4LCJleHAiOjE0Nzc1NjY0NTgsImlhdCI6MTQ3NzU2NTI1OH0.dSwwufd4-gztkLpttZsZ1255oEzpWCJkayR_4yvNL1s

डेमो यहां डाला गया है: https://github.com/cuongle/WebApi.Jwt


5
@Cuong Le द्वारा अच्छी तरह से समझाया गया है, लेकिन मैं इसे और अधिक जोड़ना पसंद करता हूं: यदि आप Microsoft में उपयोग किए जा रहे OJIN चेक का उपयोग करें। BearerAuthentication Microsoft.Owin.Security.Jwt में उपलब्ध हैं। आप इस ओपिन मिडलवेयर का उपयोग वेबपीआई पर हर आने वाले अनुरोध को स्वचालित रूप से सत्यापित करने के लिए कर सकते हैं। मिडिलवेयर रजिस्टर करने के लिए ओवेन स्टार्टअप क्लास का उपयोग करें
जेक

5
@AmirPopovich आपको प्रतिक्रिया पर टोकन सेट करने की आवश्यकता नहीं है, टोकन को क्लाइंट साइड पर कहीं और संग्रहीत करने की आवश्यकता है, वेब के लिए, आप स्थानीय भंडारण में रख सकते हैं, जब भी आप HTTP अनुरोध भेजते हैं, तो हेडर पर टोकन डालते हैं।
कोउंगल

7
वाह यह सबसे सरल अन्वेषण है जो मैंने लंबे समय में देखा है। +100 अगर मैं कर सकता
gyozo kudor

4
@Homam: सॉरी फ्राइड दिस लेट जवाब, जनरेट करने का सबसे अच्छा तरीका है: varhmac = new HMACSHA256();var key = Convert.ToBase64String(hmac.Key);
cuongle

4
CuongLe के रेपो से डेमो कोड का उपयोग करने वाला कोई भी व्यक्ति नोटिस करेगा कि कोई बग है, जिसमें कोई प्राधिकरण शीर्षलेख के साथ अनुरोधों को संभाला नहीं गया है, जिसका अर्थ है कि कोई भी क्वेरी बिना किसी के माध्यम से प्राप्त हो सकती है (इतना सुरक्षित समापन बिंदु नहीं!)। इस मुद्दे को ठीक करने के लिए @magicleon से एक पुल अनुरोध है: github.com/cuongle/WebApi.Jwt/pull/4
Chucky

11

मैं इसे न्यूनतम प्रयास (ASP.NET कोर के साथ ही सरल) के साथ हासिल करने में कामयाब रहा हूं।

उसके लिए मैं OWIN Startup.csफ़ाइल और Microsoft.Owin.Security.Jwtलाइब्रेरी का उपयोग करता हूं ।

एप्लिकेशन को हिट Startup.csकरने के लिए हमें संशोधन करने की आवश्यकता है Web.config:

<configuration>
  <appSettings>
    <add key="owin:AutomaticAppStartup" value="true" />
    ...

यहाँ कैसे Startup.csदिखना चाहिए:

using MyApp.Helpers;
using Microsoft.IdentityModel.Tokens;
using Microsoft.Owin;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Jwt;
using Owin;

[assembly: OwinStartup(typeof(MyApp.App_Start.Startup))]

namespace MyApp.App_Start
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseJwtBearerAuthentication(
                new JwtBearerAuthenticationOptions
                {
                    AuthenticationMode = AuthenticationMode.Active,
                    TokenValidationParameters = new TokenValidationParameters()
                    {
                        ValidAudience = ConfigHelper.GetAudience(),
                        ValidIssuer = ConfigHelper.GetIssuer(),
                        IssuerSigningKey = ConfigHelper.GetSymmetricSecurityKey(),
                        ValidateLifetime = true,
                        ValidateIssuerSigningKey = true
                    }
                });
        }
    }
}

आप में से बहुत से लोग आजकल ASP.NET Core का उपयोग करते हैं, इसलिए जैसा कि आप देख सकते हैं कि हमारे पास जो कुछ है, उससे बहुत भिन्न नहीं है।

यह वास्तव में मुझे पहले हैरान कर गया, मैं कस्टम प्रदाताओं को लागू करने की कोशिश कर रहा था, आदि, लेकिन मुझे उम्मीद नहीं थी कि यह इतना सरल होगा। OWINबस चट्टानों!

उल्लेख करने के लिए बस एक चीज - जब मैंने सक्षम किया तब ओविन स्टार्टअप NSWagलाइब्रेरी ने मेरे लिए काम करना बंद कर दिया (जैसे कि आप में से कुछ एंगुलर ऐप के लिए टाइपिंग एचटीटीपी प्रॉक्सी तैयार कर सकते हैं)।

समाधान भी बहुत आसान था - मैं प्रतिस्थापित NSWagके साथ Swashbuckleऔर कोई अन्य समस्या नहीं था।


ठीक है, अब साझाकरण ConfigHelperकोड:

public class ConfigHelper
{
    public static string GetIssuer()
    {
        string result = System.Configuration.ConfigurationManager.AppSettings["Issuer"];
        return result;
    }

    public static string GetAudience()
    {
        string result = System.Configuration.ConfigurationManager.AppSettings["Audience"];
        return result;
    }

    public static SigningCredentials GetSigningCredentials()
    {
        var result = new SigningCredentials(GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256);
        return result;
    }

    public static string GetSecurityKey()
    {
        string result = System.Configuration.ConfigurationManager.AppSettings["SecurityKey"];
        return result;
    }

    public static byte[] GetSymmetricSecurityKeyAsBytes()
    {
        var issuerSigningKey = GetSecurityKey();
        byte[] data = Encoding.UTF8.GetBytes(issuerSigningKey);
        return data;
    }

    public static SymmetricSecurityKey GetSymmetricSecurityKey()
    {
        byte[] data = GetSymmetricSecurityKeyAsBytes();
        var result = new SymmetricSecurityKey(data);
        return result;
    }

    public static string GetCorsOrigins()
    {
        string result = System.Configuration.ConfigurationManager.AppSettings["CorsOrigins"];
        return result;
    }
}

एक अन्य महत्वपूर्ण पहलू - मैंने जेडब्ल्यूटी टोकन को प्राधिकरण हेडर के माध्यम से भेजा है , इसलिए टाइपस्क्रिप्ट कोड मेरे लिए निम्नानुसार दिखता है:

(नीचे कोड NSWag द्वारा बनाया गया है )

@Injectable()
export class TeamsServiceProxy {
    private http: HttpClient;
    private baseUrl: string;
    protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;

    constructor(@Inject(HttpClient) http: HttpClient, @Optional() @Inject(API_BASE_URL) baseUrl?: string) {
        this.http = http;
        this.baseUrl = baseUrl ? baseUrl : "https://localhost:44384";
    }

    add(input: TeamDto | null): Observable<boolean> {
        let url_ = this.baseUrl + "/api/Teams/Add";
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(input);

        let options_ : any = {
            body: content_,
            observe: "response",
            responseType: "blob",
            headers: new HttpHeaders({
                "Content-Type": "application/json", 
                "Accept": "application/json",
                "Authorization": "Bearer " + localStorage.getItem('token')
            })
        };

हेडर भाग देखें - "Authorization": "Bearer " + localStorage.getItem('token')


I replaced NSWag with Swashbuckle and didn't have any further issues.क्या Swashbuckle में टाइपस्क्रिप्ट फ़ाइलों को जेनरेट करने की क्षमता है या कुछ ऐसा है जिसे आपने खुद से जोड़ा है?
क्रश करें

@crush swashbucle एक बैकएंड लाइब्रेरी है जो कि केवल बेहतर nuget nswag लाइब्रेरी की तरह, json प्रदान करता है। टाइपस्क्रिप्ट फ़ाइल का निर्माण करने के लिए आपको अभी भी npm से nswag पैकेज का उपयोग करना चाहिए।
एलेक्स हरमन

ठीक है, मैं पहले से ही कुछ समय के लिए अपनी परियोजना में swashbuckle है, यह लग रहा था जैसे आप यह सुझाव दे रहे थे कि यह nswag के बजाय TypeScript मॉडल उत्पन्न कर सकता है। मैं nswag का प्रशंसक नहीं हूं ... यह भारी है। मैंने अपना C # -> टाइपस्क्रिप्ट रूपांतरण बनाया है जो Swashbuckle में आदी है - फ़ाइलों को पोस्ट-बिल्ड प्रक्रिया के रूप में उत्पन्न करता है, और उन्हें हमारी परियोजनाओं के लिए npm फ़ीड में प्रकाशित करता है। मैं सिर्फ यह सुनिश्चित करना चाहता था कि मैंने एक स्वाशबकल परियोजना की अनदेखी नहीं की थी जो पहले से ही एक ही काम कर रही थी।
क्रश करें

8

यहाँ एक ASP.NET कोर वेब एपीआई में JWT टोकन का उपयोग करके एक दावे आधारित प्रमाणीकरण का एक बहुत ही न्यूनतम और सुरक्षित कार्यान्वयन है।

सबसे पहले, आपको एक समापन बिंदु को उजागर करने की आवश्यकता है जो एक JWT टोकन को एक उपयोगकर्ता को सौंपे गए दावों के साथ लौटाता है:

 /// <summary>
        /// Login provides API to verify user and returns authentication token.
        /// API Path:  api/account/login
        /// </summary>
        /// <param name="paramUser">Username and Password</param>
        /// <returns>{Token: [Token] }</returns>
        [HttpPost("login")]
        [AllowAnonymous]
        public async Task<IActionResult> Login([FromBody] UserRequestVM paramUser, CancellationToken ct)
        {

            var result = await UserApplication.PasswordSignInAsync(paramUser.Email, paramUser.Password, false, lockoutOnFailure: false);

            if (result.Succeeded)
            {
                UserRequestVM request = new UserRequestVM();
                request.Email = paramUser.Email;


                ApplicationUser UserDetails = await this.GetUserByEmail(request);
                List<ApplicationClaim> UserClaims = await this.ClaimApplication.GetListByUser(UserDetails);

                var Claims = new ClaimsIdentity(new Claim[]
                                {
                                    new Claim(JwtRegisteredClaimNames.Sub, paramUser.Email.ToString()),
                                    new Claim(UserId, UserDetails.UserId.ToString())
                                });


                //Adding UserClaims to JWT claims
                foreach (var item in UserClaims)
                {
                    Claims.AddClaim(new Claim(item.ClaimCode, string.Empty));
                }

                var tokenHandler = new JwtSecurityTokenHandler();
                  // this information will be retrived from you Configuration
                //I have injected Configuration provider service into my controller
                var encryptionkey = Configuration["Jwt:Encryptionkey"];
                var key = Encoding.ASCII.GetBytes(encryptionkey);
                var tokenDescriptor = new SecurityTokenDescriptor
                {
                    Issuer = Configuration["Jwt:Issuer"],
                    Subject = Claims,

                // this information will be retrived from you Configuration
                //I have injected Configuration provider service into my controller
                    Expires = DateTime.UtcNow.AddMinutes(Convert.ToDouble(Configuration["Jwt:ExpiryTimeInMinutes"])),

                    //algorithm to sign the token
                    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)

                };

                var token = tokenHandler.CreateToken(tokenDescriptor);
                var tokenString = tokenHandler.WriteToken(token);

                return Ok(new
                {
                    token = tokenString
                });
            }

            return BadRequest("Wrong Username or password");
        }

अब आपको ConfigureServicesअपने स्टार्टअप के अंदर अपनी सेवाओं में प्रमाणीकरण जोड़ने की जरूरत है। JWT प्रमाणीकरण को अपनी डिफ़ॉल्ट प्रमाणीकरण सेवा जैसे:

services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
             .AddJwtBearer(cfg =>
             {
                 cfg.RequireHttpsMetadata = false;
                 cfg.SaveToken = true;
                 cfg.TokenValidationParameters = new TokenValidationParameters()
                 {
                     //ValidateIssuerSigningKey = true,
                     IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["JWT:Encryptionkey"])),
                     ValidateAudience = false,
                     ValidateLifetime = true,
                     ValidIssuer = configuration["Jwt:Issuer"],
                     //ValidAudience = Configuration["Jwt:Audience"],
                     //IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:Key"])),
                 };
             });

अब आप अपनी प्राधिकरण सेवाओं में इस तरह से नीतियां जोड़ सकते हैं:

services.AddAuthorization(options =>
            {
                options.AddPolicy("YourPolicyNameHere",
                                policy => policy.RequireClaim("YourClaimNameHere"));
            });

वैकल्पिक , आप अपने सभी दावों को अपने डेटाबेस से भी (आवश्यक नहीं) कर सकते हैं क्योंकि यह केवल आपके एप्लिकेशन स्टार्टअप पर एक बार चलेगा और उन्हें इस तरह की नीतियों में जोड़ देगा:

  services.AddAuthorization(async options =>
            {
                var ClaimList = await claimApplication.GetList(applicationClaim);
                foreach (var item in ClaimList)
                {                        
                    options.AddPolicy(item.ClaimCode, policy => policy.RequireClaim(item.ClaimCode));                       
                }
            });

अब आप पॉलिसी फ़िल्टर को उन तरीकों में से किसी पर भी डाल सकते हैं जिन्हें आप इस तरह से अधिकृत करना चाहते हैं:

 [HttpPost("update")]
        [Authorize(Policy = "ACC_UP")]
        public async Task<IActionResult> Update([FromBody] UserRequestVM requestVm, CancellationToken ct)
        {
//your logic goes here
}

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


3

मुझे लगता है कि आपको JWT टोकन का समर्थन करने के लिए कुछ 3D पार्टी सर्वर का उपयोग करना चाहिए और WEB API 2 में बॉक्स JWT सपोर्ट नहीं है।

हालाँकि हस्ताक्षरित टोकन (JWT नहीं) के कुछ प्रारूप का समर्थन करने के लिए एक OWIN परियोजना है। यह वेब साइट के लिए प्रमाणीकरण का एक सरल रूप प्रदान करने के लिए कम OAuth प्रोटोकॉल के रूप में काम करता है।

आप इसके बारे में अधिक पढ़ सकते हैं जैसे यहाँ

यह लंबे समय तक है, लेकिन अधिकांश भाग नियंत्रक और ASP.NET पहचान के साथ विवरण हैं जिनकी आपको आवश्यकता नहीं है। सबसे महत्वपूर्ण हैं

चरण 9: OAuth बियरर टोकन पीढ़ी के लिए समर्थन जोड़ें

चरण 12: बैक-एंड एपीआई का परीक्षण

वहां आप पढ़ सकते हैं कि एंडपॉइंट (उदाहरण के लिए "/ टोकन") कैसे सेट करें, जिसे आप फ्रंटएंड (और अनुरोध के प्रारूप पर विवरण) से एक्सेस कर सकते हैं।

अन्य चरण उस समापन बिंदु को डेटाबेस से कैसे कनेक्ट करें, आदि पर विवरण प्रदान करते हैं और आप उन हिस्सों को चुन सकते हैं जिनकी आपको आवश्यकता है।


2

मेरे मामले में JWT को एक अलग API द्वारा बनाया गया है, इसलिए ASP.NET को केवल डीकोड करना होगा और इसे मान्य करना होगा। स्वीकृत उत्तर के विपरीत हम RSA का उपयोग कर रहे हैं जो एक गैर-सममित एल्गोरिथ्म है, इसलिएSymmetricSecurityKey ऊपर उल्लिखित वर्ग काम नहीं करेगा।

यहाँ परिणाम है।

using Microsoft.IdentityModel.Protocols;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Threading;
using System.Threading.Tasks;

    public static async Task<JwtSecurityToken> VerifyAndDecodeJwt(string accessToken)
    {
        try
        {
            var configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>($"{securityApiOrigin}/.well-known/openid-configuration", new OpenIdConnectConfigurationRetriever());
            var openIdConfig = await configurationManager.GetConfigurationAsync(CancellationToken.None);
            var validationParameters = new TokenValidationParameters()
            {
                ValidateLifetime = true,
                ValidateAudience = false,
                ValidateIssuer = false,
                RequireSignedTokens = true,
                IssuerSigningKeys = openIdConfig.SigningKeys,
            };
            new JwtSecurityTokenHandler().ValidateToken(accessToken, validationParameters, out var validToken);
            // threw on invalid, so...
            return validToken as JwtSecurityToken;
        }
        catch (Exception ex)
        {
            logger.Info(ex.Message);
            return null;
        }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.