ASP.NET ওয়েব API এর জন্য JWT প্রমাণীকরণ


264

আমি আমার ওয়েব এপিআই অ্যাপ্লিকেশনটিতে জেডব্লিউটি বহনকারী টোকেন (জেএসএন ওয়েব টোকেন) সমর্থন করার চেষ্টা করছি এবং আমি হারিয়ে যাচ্ছি।

আমি নেট নেট এবং OWIN অ্যাপ্লিকেশনগুলির জন্য সমর্থন দেখতে পাচ্ছি।
আমি বর্তমানে আইআইএস-এ আমার অ্যাপ্লিকেশনটি হোস্ট করছি।

আমি আমার অ্যাপ্লিকেশনটিতে এই প্রমাণীকরণের মডিউলটি কীভাবে অর্জন করতে পারি? <authentication>আমি ফর্মগুলি / উইন্ডোজ প্রমাণীকরণের মতো কনফিগারেশনটি ব্যবহার করার মতো কোনও উপায় আছে কি ?

উত্তর:


611

আমি এই প্রশ্নের উত্তর দিয়েছি: 4 বছর আগে এইচএমএসি ব্যবহার করে একটি এএসপি.নেট ওয়েব এপিআই কীভাবে সুরক্ষিত করা যায়

এখন, সুরক্ষার পরিবর্তে প্রচুর জিনিসগুলি বিশেষত জেডাব্লুটি জনপ্রিয় হয়ে উঠছে। এখানে, আমি কীভাবে সহজ এবং মৌলিক উপায়ে JWT ব্যবহার করতে পারি তা বোঝানোর চেষ্টা করব, সুতরাং আমরা ওউইএন, ওউথ 2, এএসপি.নেট পরিচয় জঙ্গল থেকে হারিয়ে যাব না ... :)।

আপনি যদি জেডাব্লুটি টোকেন না জানেন তবে আপনার এখানে কিছুটা নজর দেওয়া দরকার:

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 ফর্ম্যাট যা বেস 64 এ এনকোড করা আছে।
  3. স্বাক্ষর: শিরোনাম এবং দাবিগুলির ভিত্তিতে তৈরি এবং স্বাক্ষরিত করা হয়েছে যা বেস 64 এ এনকোড করা আছে।

যদি আপনি উপরের টোকেনটি দিয়ে jwt.io ওয়েবসাইটটি ব্যবহার করেন তবে আপনি টোকেনটি ডিকোড করতে পারেন এবং নীচের মত দেখতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

প্রযুক্তিগতভাবে, জেডাব্লুটিটি স্বাক্ষর ব্যবহার করে যা শিরোনাম থেকে স্বাক্ষরিত হয় এবং শিরোনামগুলিতে উল্লিখিত সুরক্ষা অ্যালগরিদমের সাথে দাবী করে (উদাহরণস্বরূপ: এইচএমএএসএএসএসিএ 25)। সুতরাং, আপনি যদি দাবিতে কোনও সংবেদনশীল তথ্য সঞ্চয় করেন তবে জেডাব্লুটিটি এইচটিটিপিগুলির মাধ্যমে স্থানান্তরিত হওয়া দরকার।

এখন, জেডাব্লুটি প্রমাণীকরণ ব্যবহার করার জন্য, যদি আপনার কোনও লিগ্যাসি ওয়েব এপিআই সিস্টেম থাকে তবে আপনাকে সত্যই কোনও ওউইন মিডলওয়্যারের প্রয়োজন হবে না। সাধারণ ধারণাটি কীভাবে জেডাব্লুটি টোকেন সরবরাহ করবেন এবং অনুরোধ এলে কীভাবে টোকেনকে বৈধতা দেওয়া যায়। এটাই.

ডেমোতে ফিরে যান, জেডাব্লুটি টোকেনকে হালকা ওজনের রাখতে আমি কেবল সঞ্চয় করি usernameএবং expiration timeজেডব্লিউটিতে। তবে এইভাবে, আরও তথ্য যুক্ত করতে আপনাকে নতুন স্থানীয় পরিচয় (অধ্যক্ষ) পুনর্নির্মাণ করতে হবে: ভূমিকা .. আপনি যদি ভূমিকা অনুমোদন করতে চান তবে। তবে, আপনি যদি জেডাব্লুটিটিতে আরও তথ্য যুক্ত করতে চান তবে এটি আপনার উপর নির্ভর করে: এটি খুব নমনীয়।

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;
    }
}

এটি একটি নিষ্পাপ কর্ম; উত্পাদনে আপনার জেডাব্লুটি টোকেন সরবরাহ করতে একটি পোষ্ট অনুরোধ বা একটি বেসিক প্রমাণীকরণের শেষ পয়েন্ট ব্যবহার করা উচিত।

উপর ভিত্তি করে টোকেন জেনারেট করবেন কীভাবে username?

System.IdentityModel.Tokens.Jwtটোকেন তৈরি করতে আপনি মাইক্রোসফ্ট থেকে ডেকে নেওয়া নুগেট প্যাকেজ ব্যবহার করতে পারেন , অথবা আপনি চাইলে অন্য কোনও প্যাকেজও ব্যবহার করতে পারেন। ডেমো, আমি ব্যবহার 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 বৈধ করবেন? ডেমো আমি নির্মাণ করেছি JwtAuthenticationAttributeযা থেকে উত্তরাধিকারী IAuthenticationFilter(ইন প্রমাণীকরণ ফিল্টার সম্পর্কে আরো বিস্তারিত এখানে )।

এই অ্যাট্রিবিউট দিয়ে, আপনি যে কোনও ক্রিয়াকলাপকে প্রমাণীকরণ করতে পারেন: আপনাকে কেবলমাত্র এই ক্রিয়াটির উপরে এই বৈশিষ্ট্যটি রাখতে হবে।

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

আপনি যদি নিজের ওয়েবএপিআইয়ের জন্য আগত সমস্ত অনুরোধ (কন্ট্রোলার বা কর্মের সাথে সুনির্দিষ্ট না হয়) বৈধ করতে চান তবে আপনি ওউইন মিডলওয়্যার বা ডেলিগেটহ্যান্ডারও ব্যবহার করতে পারেন

নীচে প্রমাণীকরণ ফিল্টার থেকে মূল পদ্ধতি:

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);
}

ওয়ার্কফ্লো হ'ল, জেডাব্লুটি লাইব্রেরি (উপরে নিউগেট প্যাকেজ) ব্যবহার করে জেডাব্লুটি টোকেনকে বৈধতা দিন এবং তারপরে ফিরে আসুন 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;
    }
}

যদি জেডাব্লুটি টোকেনটি বৈধ হয়ে থাকে এবং অধ্যক্ষটি ফিরে আসে, আপনার উচিত নতুন স্থানীয় পরিচয় তৈরি করা এবং ভূমিকা অনুমোদনের জন্য এটিতে আরও তথ্য রাখা উচিত।

যোগ করার জন্য মনে রাখুন 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
@ কুওং লে দ্বারা ভালভাবে ব্যাখ্যা করা হয়েছে তবে আমি আরও যুক্ত করতে চাই: আপনি যদি ওউআইএন ব্যবহার করেন তবে মাইক্রোসফ্ট-ওউইন.সিকিউরিটি.জেডে উপলব্ধ ইউজডব্লিউটারআউটেনটিকেশনটি পরীক্ষা করুন আপনি প্রতিটি আগত অনুরোধকে স্বয়ংক্রিয়ভাবে বৈধ করতে ওয়েবউপিতে এই ওউন মিডলওয়্যারটি ব্যবহার করতে পারেন। মিডওয়্যারের রেজিস্ট্রেশন করতে আউইন স্টার্টআপ ক্লাসটি ব্যবহার করুন
জেক

5
@ আমিরপোপোভিচ আপনাকে প্রতিক্রিয়াতে টোকেন সেট করতে হবে না, টোকেনটি ক্লায়েন্টের অন্য কোনও জায়গায় সংরক্ষণ করতে হবে, ওয়েবের জন্য, আপনি স্থানীয় স্টোরেজে রাখতে পারেন, যখনই আপনি এইচটিটিপি অনুরোধ পাঠান, টোকনটি শিরোনামে রেখে দিন।
cuongle

7
বাহ এটি আমি সবচেয়ে দীর্ঘ সময়ে দেখা সবচেয়ে সাধারণ ব্যাখ্যা। +100 যদি আমি পারতাম
gyozo kudor

4
@ হোমাম: দুঃখিত, এই দেরিতে উত্তরটি উত্তর দিয়েছি, উত্পন্ন করার সর্বোত্তম উপায় হ'ল: hmac = new HMACSHA256();var key = Convert.ToBase64String(hmac.Key);
বর্ণ

4
কুওনলির রেপো থেকে ডেমো কোডটি ব্যবহার করা যে কেউ দেখতে পাবেন যে কোনও বাগ রয়েছে যেখানে অনুমোদনের শিরোনামহীন অনুরোধগুলি পরিচালনা করা হয় না, অর্থাত্ কোনও প্রশ্ন ছাড়াই (কোনও শেষ পয়েন্টটি নিরাপদ নয়!) পেতে পারে। এই সমস্যাটি এখানে ঠিক করার জন্য @ ম্যাজিক্যালনের কাছ থেকে একটি অনুরোধ রইল: github.com/cuongle/WebApi.Jwt/pull/4
চকি

11

আমি এটি সর্বনিম্ন প্রচেষ্টা দিয়ে অর্জন করতে সক্ষম হয়েছি (এএসপি.নেট কোরের মতোই সহজ)।

তার জন্য আমি 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 কোর ব্যবহার করেন, যাতে আপনি দেখতে পাচ্ছেন যে এটি আমাদের কাছে রয়েছে তার থেকে আলাদা নয়।

এটি সত্যই আমাকে প্রথম বিভ্রান্ত করেছিল, আমি কাস্টম সরবরাহকারী ইত্যাদি বাস্তবায়নের চেষ্টা করছিলাম তবে আমি এটিকে এত সহজ বলে আশা করিনি। 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;
    }
}

আরেকটি গুরুত্বপূর্ণ দিক - আমি জেডাব্লুটি টোকনকে অনুমোদনের শিরোনামের মাধ্যমে প্রেরণ করেছি , সুতরাং টাইপস্ক্রিপ্ট কোডটি নীচে আমার জন্য দেখায়:

(নীচের কোডটি এনএসওয়্যাগ দ্বারা উত্পাদিত হয়েছে )

@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

8

এখানে একটি এএসপি.নেট কোর ওয়েব API এ 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 প্রমাণীকরণ যুক্ত করতে আপনার এখন আপনার startup.cs এর ভিতরে আপনার পরিষেবাগুলিতে প্রমাণীকরণ যুক্ত করতে হবে :

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

আমি মনে করি আপনার জেডাব্লুটি টোকেন সমর্থন করতে কিছু 3 ডি পার্টি সার্ভার ব্যবহার করা উচিত এবং ডাব্লুইইবি এপিআই 2 তে JWT সমর্থন বাক্সের বাইরে নেই।

তবে স্বাক্ষরিত টোকেনের কিছু ফর্ম্যাট (জেডাব্লুটিটি নয়) সমর্থন করার জন্য একটি ওউইউন প্রকল্প রয়েছে। এটি কোনও ওয়েবসাইটের জন্য প্রমাণীকরণের একটি সহজ ফর্ম সরবরাহ করতে হ্রাস OAuth প্রোটোকল হিসাবে কাজ করে।

আপনি এটি সম্পর্কে আরও পড়তে পারেন যেমন এখানে

এটি বরং দীর্ঘ, তবে বেশিরভাগ অংশগুলি কন্ট্রোলার এবং এএসপি.নেট পরিচয়ের সাথে বিশদ যা আপনার প্রয়োজন হয় না। সর্বাধিক গুরুত্বপূর্ণ

পদক্ষেপ 9: OAuth বহনকারী টোকেন জেনারেশনের জন্য সমর্থন যোগ করুন

পদক্ষেপ 12: ব্যাক-এন্ড এপিআই পরীক্ষা করা

সেখানে আপনি কীভাবে শেষ পয়েন্ট সেট আপ করতে পারেন (যেমন "/ টোকেন") যা আপনি ফ্রন্টএন্ড থেকে অ্যাক্সেস করতে পারেন (এবং অনুরোধের ফর্ম্যাটের বিবরণ)।

অন্যান্য পদক্ষেপগুলি কীভাবে সেই শেষ পয়েন্টটি ডাটাবেস ইত্যাদির সাথে সংযুক্ত করতে হয় সে সম্পর্কিত বিশদ সরবরাহ করে এবং আপনার প্রয়োজনীয় অংশগুলি চয়ন করতে পারেন।


2

আমার ক্ষেত্রে জেডাব্লুটিটি পৃথক এপিআই দ্বারা তৈরি করা হয়েছে যাতে এএসপি.এনইটি কেবল এটির ডিকোড করে বৈধতা দেয়। গৃহীত উত্তরের বিপরীতে আমরা আরএসএ ব্যবহার করছি যা একটি অ-প্রতিসম অ্যালগরিদম, সুতরাং 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;
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.