ASP.NET কোর 2.0 প্রমাণীকরণ মিডওয়্যার


91

কোর 1.1 এর সাথে @ ব্লোডার্টের পরামর্শ অনুসরণ করেছে এবং একটি কাস্টম মিডলওয়্যার প্রয়োগ করেছে:

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

এটি এর মতো কাজ করেছে:

  1. মিডলওয়্যার দৌড়ে গেল। অনুরোধ শিরোনামগুলি থেকে একটি টোকেন তুলেছে।
  2. টোকেন যাচাই করা হয়েছে এবং যদি বৈধ কোনও পরিচয় (দাবি দাবি) তৈরি করে যাতে একাধিক দাবি থাকে যা এটি এটি HTTPContext.User.AddIdentity () এর মাধ্যমে যুক্ত করে;
  3. পরিষেবাদিগুলি ব্যবহার করে কনফিগার সার্ভিসগুলিতে Aএড অনুমোদনের ক্ষেত্রে আমি মিডওয়্যার দ্বারা সরবরাহ করা দাবী দাবি করার জন্য একটি নীতি যুক্ত করেছি।
  4. কন্ট্রোলার / ক্রিয়াকলাপগুলিতে আমি তখন [অনুমোদন (ভূমিকা = "মিডলওয়্যারের যোগ করা কিছু ভূমিকা") ব্যবহার করব]]

এটি কিছুটা 2.0 নিয়ে কাজ করে, ব্যতীত যদি টোকেনটি বৈধ না হয় (উপরের পদক্ষেপ 2) এবং দাবিটি কখনও যুক্ত না করা হয় আমি পেয়েছি "কোনও প্রমাণীকরণের স্কিম নির্দিষ্ট করা হয়নি, এবং কোনও ডিফল্টচ্যালেনজ স্কিম পাওয়া যায় নি।"

সুতরাং এখন আমি পড়ছি যে লেখক 2.0 সালে পরিবর্তিত হয়েছে:

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

আমার জন্য এএসপি.নেট কোর 2.0 তে একই কাজ করার সঠিক পথটি কী? সত্যিকারের কাস্টম প্রমাণীকরণ করার জন্য আমি কোনও উদাহরণ দেখছি না।



আপনি কি আপনার কোডটি যুক্ত করতে পারেন যাতে আমরা একবার দেখে নিই? আমি জানি আমি কোর 2.0 এ জেডাব্লুটিটির সাথে সমস্যা ছিল - এটি প্রারম্ভকালে এটিকে ঘুরিয়ে দেওয়ার ঘটনা
ওয়েবেজাইন

উত্তর:


198

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

এমএসডিএন-তে কয়েকটি ডকুমেন্টেশন সন্ধানের পরে, আমি একটি ক্লাস পেয়েছি AuthenticationHandler<TOption>যা IAuthenticationHandlerইন্টারফেস প্রয়োগ করে ।

সেখান থেকে, https://github.com/aspnet/Security এ অবস্থিত বিদ্যমান প্রমাণীকরণের স্কিমগুলির সাথে একটি সম্পূর্ণ কোডবেস পেয়েছি

এর মধ্যে একটির অভ্যন্তরে এটি দেখায় যে কীভাবে মাইক্রোসফ্ট JwtBearer অনুমোদন স্কিম প্রয়োগ করে। ( https://github.com/aspnet/Security/tree/master/src/Mic Microsoft.AspNetCore.Authentication.JwtBearer )

আমি সেই কোডটির বেশিরভাগটি একটি নতুন ফোল্ডারে অনুলিপি করেছিলাম এবং যা করতে হবে সেগুলি পরিষ্কার করে দিয়েছি JwtBearer

ইন JwtBearerHandlerবর্গ (যা প্রসারিত AuthenticationHandler<>), সেখানে একটি ওভাররাইড এরTask<AuthenticateResult> HandleAuthenticateAsync()

আমি কাস্টম টোকেন সার্ভারের মাধ্যমে দাবি স্থাপনের জন্য আমাদের পুরাতন মিডওয়্যারের সাথে যুক্ত করেছি, এবং এখনও অনুমতি নিয়ে কিছু সমস্যার মুখোমুখি হয়েছি, যখন একটি টোকেন অবৈধ ছিল এবং কোনও দাবি সেট আপ করা হয়নি তখন কেবল 200 OKতার পরিবর্তে একটি থুতু 401 Unauthorizedদিয়ে।

আমি বুঝতে পেরেছি যে আমি যে Task HandleChallengeAsync(AuthenticationProperties properties)কোনও কারণে [Authorize(Roles="")]নিয়ামকের মাধ্যমে অনুমতি নির্ধারণের জন্য ব্যবহৃত হয় যা আমি ওভাররাইড করেছি ।

এই ওভাররাইডটি সরিয়ে দেওয়ার পরে, কোডটি কাজ করেছিল 401এবং অনুমতিগুলি মিলে না গেলে সফলভাবে একটি নিক্ষেপ করেছিল।

এর প্রধান গ্রহণযোগ্যতা হ'ল এখন আপনি একটি কাস্টম মিডলওয়্যার ব্যবহার করতে পারবেন না, আপনাকে এটি মাধ্যমে প্রয়োগ করতে হবে এবং ব্যবহারের সময় AuthenticationHandler<>আপনাকে সেট করতে হবে ।DefaultAuthenticateSchemeDefaultChallengeSchemeservices.AddAuthentication(...)

এটির মতো দেখতে কী হওয়া উচিত তার উদাহরণ এখানে:

স্টার্টআপ। সি / কনফিগার সার্ভিসগুলিতে () যুক্ত করুন:

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

স্টার্টআপ। সি / কনফিগার () এ যুক্ত করুন:

app.UseAuthentication();

একটি নতুন ফাইল কাস্টমআথএক্সটেনশন। সি। তৈরি করুন

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

একটি নতুন ফাইল কাস্টমআথওপশনস সি। তৈরি করুন

public class CustomAuthOptions: AuthenticationSchemeOptions
{
    public CustomAuthOptions()
    {

    }
}

একটি নতুন ফাইল কাস্টমআথহ্যান্ডলার সি। তৈরি করুন

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

4
দুর্দান্ত পোস্ট, তবে আপনার কোডটি সংকলন করতে আমার কিছু সমস্যা আছে। কাস্টমআথঅপশন এবং প্রমাণীকরণের ফলাফলগুলি অনুপস্থিত। আপনি কি পোস্ট করতে পারেন?
alexb

8
আপনি কি গিথুব রেপোতে কোডে আপনার সিদ্ধান্তগুলি ভাগ করতে রাজি?
সিএসহার্পার

4
আপনি দয়া করে ব্যাখ্যা করতে পারেন DefaultAuthenticateSchemeএবং DefaultChallengeScheme? বুঝতে পারছি না তারা দু'জনই কেন ব্যবহার হচ্ছে? এবং তাদের মধ্যে পার্থক্য কি।
মোহাম্মদ নুরাল্ডিন

11
"সেখান থেকে, আমি github.com/aspnet/Security এ অবস্থিত বিদ্যমান প্রমাণীকরণ প্রকল্পগুলির সাথে একটি সম্পূর্ণ কোডবেস পেয়েছি ।" আপনি এই (সত্যই দুর্দান্ত) উত্তরের সাথে অনুসরণ করে কীভাবে এএসপি.এনইটি টিম এটি করে তা দেখুন। আমাদের মধ্যে কেউ কি কখনও ভেবেছিলেন যে একদিন আমরা এমএস কোড এবং অনুশীলনের প্রশ্ন জিজ্ঞাসা করব এবং উত্তরটি হবে, "কেবল তাদের কোডবেসটি দেখুন?"
মার্ক এল।

4
অন্যদের পরে আসার জন্য আপনার নামস্থানটির AuthExtensionভিতরে থাকা দরকার Microsoft.Extensions.DependencyInjection। এই উদাহরণটি দেখুন: github.com/aspnet/Security/blob/rel/2.0.0/src/…
গ্যারি পোলি

4

আপনি যে নিবন্ধটি উল্লেখ করেছেন তাতে কোর 1.x থেকে মূল 2.0 তে পরিচয় উল্লেখযোগ্য পরিবর্তন রয়েছে। বড় পরিবর্তনটি মিডওয়্যার পদ্ধতির থেকে দূরে চলেছে এবং কাস্টম পরিষেবাদি কনফিগার করতে নির্ভরতা ইঞ্জেকশন ব্যবহার করছে। এটি আরও জটিল বাস্তবায়নের জন্য পরিচয় কাস্টমাইজ করার ক্ষেত্রে অনেক বেশি নমনীয়তা সরবরাহ করে। সুতরাং আপনি উপরোক্ত মিডলওয়্যার পদ্ধতির থেকে দূরে সরে যেতে এবং পরিষেবাগুলির দিকে যেতে চান। এই লক্ষ্য অর্জনের জন্য রেফারেন্স করা নিবন্ধে মাইগ্রেশন পদক্ষেপগুলি অনুসরণ করুন। প্রতিস্থাপন করে শুরু app.UseIdentity সঙ্গে app.UseAuthenticationUseIdentity অবমূল্যায়ন করা হয় এবং ভবিষ্যতের সংস্করণগুলিতে সমর্থিত হবে না। কীভাবে কোনও কাস্টম দাবী রূপান্তর প্রবেশ করানো যায় এবং দাবির উপর অনুমোদনের কীভাবে করা যায় তার সম্পূর্ণ উদাহরণের জন্যএই ব্লগ পোস্ট দেখুন


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