এএসপি.নেট কোর টোকেন ভিত্তিক প্রমাণীকরণ C


161

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

আমার পরিস্থিতিটি কী: কৌণিক অ্যাপ্লিকেশনটির /tokenইউআরএল পাসওয়ার্ড এবং ব্যবহারকারীর নাম এবং পাসওয়ার্ডের অনুরোধ করা উচিত । WebApi ব্যবহারকারীর অনুমোদন দেওয়া উচিত এবং প্রত্যাবর্তন করা উচিত access_tokenযা নিম্নলিখিত অনুরোধগুলিতে অ্যাঙ্গুলার অ্যাপ্লিকেশন ব্যবহার করবে।

ASP.NET- র বর্তমান সংস্করণে আমার ঠিক কী প্রয়োজন তা বাস্তবায়নের বিষয়ে আমি দুর্দান্ত নিবন্ধটি পেয়েছি - ASP.NET ওয়েব API 2, ওউইন এবং পরিচয় ব্যবহার করে টোকেন ভিত্তিক প্রমাণীকরণ । তবে এএসপি.নেট কোরে একই জিনিস কীভাবে করা যায় তা আমার পক্ষে স্পষ্ট নয়।

আমার প্রশ্ন: টোকেন ভিত্তিক প্রমাণীকরণের সাথে কাজ করার জন্য কীভাবে এএসপি.নেট কোর ওয়েবএপি অ্যাপ্লিকেশনটি কনফিগার করবেন?


আমি একই সমস্যা হচ্ছে এবং আমি যে সব নিজেকে করছেন উপর planing হয়েছিল, আপনার অবগতির আরেকটা প্রশ্ন হল stackoverflow.com/questions/29055477/... কিন্তু কোন anserw এখনো, কি রে কি হইছে দেখি
Son_of_Sam


আমিও একই সমস্যার মুখোমুখি হয়েছি কিন্তু এখনও কোনও সমাধান খুঁজে পাইনি ... আমার অন্য টোকেনকে প্রমাণীকরণকারী অন্য পরিষেবা ব্যবহার করে একটি কাস্টম প্রমাণীকরণ লিখতে হবে।
মায়াঙ্ক গুপ্ত

উত্তর:


137

নেট কোর 3.1 এর জন্য আপডেট করুন:

ডেভিড ফওলার (এএসপি। নেট কোর দলের জন্য স্থপতি) জেডাব্লুটি প্রদর্শন করে এমন একটি সাধারণ অ্যাপ্লিকেশন সহ অবিশ্বাস্যভাবে সহজ টাস্ক অ্যাপ্লিকেশনগুলির একটি সেট স্থাপন করেছেন । আমি শীঘ্রই এই পোস্টে তার আপডেটগুলি এবং সরলীকরণমূলক স্টাইলকে যুক্ত করব।

নেট কোর 2 এর জন্য আপডেট হয়েছে:

এই উত্তরের পূর্ববর্তী সংস্করণগুলি আরএসএ ব্যবহার করেছিল; আপনার একই কোড যা টোকেন তৈরি করছে তাও টোকেন যাচাই করছে যদি এটি সত্যিই প্রয়োজন হয় না। তবে, আপনি যদি দায়িত্বটি বিতরণ করছেন, আপনি সম্ভবত এখনও এর উদাহরণ ব্যবহার করে এটি করতে চান Microsoft.IdentityModel.Tokens.RsaSecurityKey

  1. কয়েকটি ধ্রুবক তৈরি করুন যা আমরা পরে ব্যবহার করব; আমি যা করেছি তা এখানে:

    const string TokenAudience = "Myself";
    const string TokenIssuer = "MyProject";
    
  2. এটি আপনার স্টার্টআপ.স এর সাথে যুক্ত করুন 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অন্য কোনও কিছুর সাথে নিঃসৃত হতে পারে না। আপনার জেডাব্লুটিটি আউটপুট দেওয়ার জন্য আপনাকে নিজস্ব নিজস্ব ব্যবস্থা সরবরাহ করতে হবে - নীচে দেখুন।

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

    এখানে, আমি ধরে নিচ্ছি আপনার ইতিমধ্যে একটি অধ্যক্ষ আছে have আপনি পরিচয় ব্যবহার করে থাকেন, আপনি ব্যবহার করতে পারেন IUserClaimsPrincipalFactory<>আপনার রুপান্তর Userএকটি মধ্যে ClaimsPrincipal

  6. এটি পরীক্ষা করার জন্য : একটি টোকেন পান, jwt.ioফর্মটিতে রাখুন । আমি উপরে প্রদত্ত নির্দেশাবলী আপনাকে স্বাক্ষরটি বৈধ করতে আপনার কনফিগারেশন থেকে গোপনীয় ব্যবহার করার অনুমতি দেয়!

  7. আপনি। নেট 4.5.৪-তে কেবল বহনকারী-প্রমাণীকরণের সংমিশ্রণে আপনার এইচটিএমএল পৃষ্ঠায় আংশিক দৃশ্যে এটি রেন্ডার করছিলেন, আপনি এখন এটি করতে একটি ব্যবহার করতে পারেন ViewComponent। এটি বেশিরভাগ উপরে কন্ট্রোলার অ্যাকশন কোডের সমান।


1
IOptions<OAuthBearerAuthenticationOptions>বিকল্পগুলি ব্যবহার করতে আপনাকে আসলে ইনজেক্ট করতে হবে; বিকল্প মডেল ফ্রেমওয়ার্ক দ্বারা সমর্থিত নামযুক্ত কনফিগারেশনের কারণে একটি বিকল্প অবজেক্ট সরাসরি ব্যবহার করা সমর্থনযোগ্য নয়।
ম্যাট ডেক্রে

2
আমি কী ব্যবহার করছি তা আপডেট হয়েছে, যদিও এখন উত্তরটি পুনরায় লেখা উচিত get আমাকে পোকার জন্য ধন্যবাদ!
ম্যাট ডেক্রে

5
# 5 এর পর থেকে মাইক্রোসফ্ট-এএসপ নেট.অথেন্টিকেশন.ওআউথবিয়ার - বিটা 5 - 6 এবং সম্ভবত পূর্ববর্তী বিটাগুলি পরিবর্তিত হয়েছে তবে সেগুলি নিশ্চিত করে নি। অ্যাথ.ড্যাডপলিসি ("বেয়ারার", নতুন অথরাইজেশনপলিসি বিল্ডার () d
ডায়নামিকলিঙ্ক

5
@ ম্যাটডেক্রে আমি এই উত্তরটিকে সাধারণ টোকেন ভিত্তিক লেখার উদাহরণের জন্য একটি প্রাথমিক পয়েন্ট হিসাবে ব্যবহার করেছি এবং এটি বিটা 7 এর বিপরীতে কাজ করার জন্য আপডেট করেছি - github.com/mrsheepuk/ASPNETSelfCreatedTokenAuthExample দেখুন - এছাড়াও এই মন্তব্যগুলির কয়েকটি পয়েন্টার অন্তর্ভুক্ত করেছে।
মার্ক হিউজ

2
আরসি 1-এর জন্য আবার আপডেট হয়েছে - গিটহাবের শাখায় বিটা 7 এবং বিটা 8-এর পুরানো সংস্করণ রয়েছে।
মার্ক হিউজেস

83

ম্যাট ডেকরীর দুর্দান্ত উত্তর থেকে কাজ করা , আমি টোকেন-ভিত্তিক প্রমাণীকরণের পুরোপুরি কার্যকর উদাহরণ তৈরি করেছি, এএসপি.নেট কোর (১.০.১) এর বিপরীতে কাজ করছি। আপনি পূর্ণ কোড জানতে পারেন GitHub থেকে এই সংগ্রহস্থলের মধ্যে (জন্য বিকল্প শাখা 1.0.0-rc1 , beta8 , beta7 ), কিন্তু সংক্ষেপে, গুরুত্বপূর্ণ পদক্ষেপ হল:

আপনার অ্যাপ্লিকেশনটির জন্য একটি কী তৈরি করুন

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

স্টার্টআপ.সি - কনফিগার সার্ভিসেস

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

// 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")]সুরক্ষিত করতে চাই এমন শেষ পয়েন্ট এবং ক্লাসে আমাদের ব্যবহারের অনুমতি দেওয়ার জন্য আমরা একটি অনুমোদন নীতিও সেট আপ করেছি ।

স্টার্টআপ.সি - কনফিগার করুন

এখানে, আমাদেরকে 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;
    }
...

তারপরে আপনাকে লগইন শেষ পয়েন্টের জন্য আপনার হ্যান্ডলারে টোকেন তৈরি করতে হবে, উদাহরণস্বরূপ আমি একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড নিচ্ছি এবং যদি একটি বিবৃতি ব্যবহার করে যাচাই করি তবে আপনার যা করতে হবে তা হল একটি দাবি তৈরি বা লোড করা is ভিত্তিক পরিচয় এবং এর জন্য টোকেন উত্পন্ন:

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
এটি @ নিক্স্পুনকে সাহায্য করেছে - আপনার যদি এ নিয়ে কোনও সমস্যা হয় তবে আমাকে গিথুবটিতে একটি টানতে অনুরোধ জানাতে বা পপ করতে দিন এবং আমি আপডেট করব!
মার্ক হিউজেস

2
এর জন্য ধন্যবাদ, তবে আমি এএসপি. নেট 4 ওয়েব এপিআই-এর বাক্সটির বাইরে কাজ করে এমন কিছু কেন এএসপি.নেট 5 এ এখন বেশ খানিকটা কনফিগারেশন প্রয়োজন বলে আমি যথেষ্ট বুঝতে পারি না back
জেএমকে

1
আমি মনে করি তারা এএসপি.নেট 5 এর জন্য "সামাজিক স্বীকৃতি" সত্যিই চাপ দিচ্ছেন, যা আমার ধারণা অনুভূত হয়েছে, তবে এমন অ্যাপ্লিকেশন রয়েছে যা উপযুক্ত নয় তাই আমি নিশ্চিত নই যে আমি তাদের জেএমকে
মার্ক হিউজের

1
@ ইউরিপি আমাকে এই উত্তরটি আরসি 2 এর জন্য আপডেট করতে হবে - আমি আমাদের অভ্যন্তরীণ অ্যাপ্লিকেশনটি আপডেট করেছি যা এটি আরসি 2 তে এখনও ব্যবহার করে তাই আমি কী জড়িত তা নিশ্চিত নই। আমি পার্থক্যটি একবার ব্যবহার করে আপডেট করব ...
মার্ক হিউজ

3

আপনি ওপেনআইডি সংযোগের নমুনাগুলি দেখতে পারেন যা জেডাব্লুটি টোকেন সহ বিভিন্ন প্রমাণীকরণ পদ্ধতিতে কীভাবে ডিল করতে হবে তা চিত্রিত করে:

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

/ প্রোভাইডার / অনুমোদনপ্রোভিডার.সি এবং এবং সেই প্রকল্পের রিসোর্সকন্ট্রোলারের যুক্তিগুলিও একবার দেখার মতো।)

বিকল্পভাবে আপনি টোকেনগুলি যাচাই করতে নীচের কোডটিও ব্যবহার করতে পারেন (সিগন্যালআর দিয়ে এটি কাজ করার জন্য একটি স্নিপেটও রয়েছে):

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

টোকেন দেওয়ার জন্য আপনি ওপেনআইডি কানেক্ট সার্ভার প্যাকেজগুলি এর মতো ব্যবহার করতে পারেন:

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

সম্পাদনা: আমি অরেলিয়া ফ্রন্ট এন্ড ফ্রেমওয়ার্ক এবং এএসপি.নেট কোর ব্যবহার করে টোকেন ভিত্তিক প্রমাণীকরণ প্রয়োগের সাথে একটি একক পৃষ্ঠার অ্যাপ্লিকেশনটি প্রয়োগ করেছি। একটি সিগন্যাল আর অবিচ্ছিন্ন সংযোগও রয়েছে। তবে আমি কোনও ডিবি বাস্তবায়ন করিনি। কোডটি এখানে দেখা যাবে: https://github.com/alexandre-spieser/AurliaAspNetCoreAuth

আশাকরি এটা সাহায্য করবে,

সেরা

অ্যালেক্স


1

ওপেনআইডিক্টটি দেখুন - এটি একটি নতুন প্রকল্প (লেখার সময়) যা এএসপি.এনইটি তে জেডাব্লুটি টোকেনগুলি তৈরি এবং কনফ্রেশ টোকেনকে সহজ করে তোলে 5.. টোকেনগুলির বৈধতাটি অন্য সফ্টওয়্যার দ্বারা পরিচালিত হয়।

ধরে নিচ্ছি যে আপনি এর সাথে ব্যবহার Identityকরছেন Entity Framework, শেষ পংক্তিটি আপনি নিজের ConfigureServicesপদ্ধতিতে যুক্ত করবেন:

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

ইন Configure, আপনি জেডাব্লুটি টোকেন পরিবেশন করতে ওপেনডিজিট সেটআপ করেছেন:

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 এর ওপেনআইডিক্ট কনটেক্সট থেকে নেওয়া উচিত।

আপনি এই ব্লগ পোস্টে পূর্ণ দৈর্ঘ্যের ব্যাখ্যা দেখতে পারেন: http://capesean.co.za/blog/asp-net-5-jwt-tokens/

একটি কার্যনির্বাহী ডেমো এখানে পাওয়া যায়: https://github.com/capesean/openiddict-test

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.