একাধিক জেডব্লিউটি বহনকারী প্রমাণীকরণ ব্যবহার করুন


89

এএসপি.এনইটি কোর 2 এ একাধিক জেডাব্লুটি টোকন জারিকারীদের সমর্থন করা কি সম্ভব? আমি বাহ্যিক পরিষেবার জন্য একটি এপিআই সরবরাহ করতে চাই এবং আমার জেডাব্লুটি টোকেনের দুটি উত্স - ফায়ারবেস এবং কাস্টম জেডাব্লুটি টোকেন ইস্যুকারী ব্যবহার করতে হবে। এএসপি.নেট কোরে আমি বেরের লেখক স্কিমের জন্য জেডাব্লুটি প্রমাণীকরণ সেট করতে পারি তবে কেবল একটি কর্তৃপক্ষের জন্য:

  services
        .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Authority = "https://securetoken.google.com/my-firebase-project"
            options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidIssuer = "my-firebase-project"
                    ValidateAudience = true,
                    ValidAudience = "my-firebase-project"
                    ValidateLifetime = true
                };
        }

আমার একাধিক ইস্যুকারী এবং শ্রোতা থাকতে পারে তবে আমি বেশ কয়েকটি কর্তৃপক্ষ সেট করতে পারি না।


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

উত্তর:


196

আপনি যা চান তা সম্পূর্ণভাবে অর্জন করতে পারেন:

services
    .AddAuthentication()
    .AddJwtBearer("Firebase", options =>
    {
        options.Authority = "https://securetoken.google.com/my-firebase-project"
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = "my-firebase-project"
            ValidateAudience = true,
            ValidAudience = "my-firebase-project"
            ValidateLifetime = true
        };
    })
    .AddJwtBearer("Custom", options =>
    {
        // Configuration for your custom
        // JWT tokens here
    });

services
    .AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes("Firebase", "Custom")
            .Build();
    });

আসুন আপনার কোড এবং এটির মধ্যে পার্থক্যটি অতিক্রম করুন।

AddAuthentication কোন পরামিতি আছে

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

এর আরেকটি ওভারলোড ব্যবহার করুন AddJwtBearer

AddXXXপ্রমাণীকরণ যুক্ত প্রতিটি একক পদ্ধতিতে বেশ কয়েকটি ওভারলোড থাকে:

এখন, আপনি একই প্রমাণীকরণ পদ্ধতিটি দু'বার ব্যবহার করেছেন তবে প্রমাণীকরণের স্কিমগুলি অবশ্যই অনন্য হতে হবে, আপনাকে দ্বিতীয় ওভারলোডটি ব্যবহার করতে হবে।

ডিফল্ট নীতি আপডেট করুন

যেহেতু অনুরোধগুলি আর স্বয়ংক্রিয়ভাবে প্রমাণীকরণ করা হবে না, [Authorize]কিছু ক্রিয়ায় অ্যাট্রিবিউট লাগানোর ফলে অনুরোধগুলি প্রত্যাখাত HTTP 401হবে এবং একটি জারি করা হবে।

যেহেতু আমরা এটি চাই না কারণ আমরা প্রমাণীকরণ হ্যান্ডলারদের অনুরোধটি প্রমাণীকরণের একটি সুযোগ দিতে চাই, আমরা অনুমোদনের সিস্টেমের ডিফল্ট নীতি পরিবর্তন করি Firebaseএবং Customপ্রমাণীকরণের স্কিম উভয়ই অনুরোধটিকে প্রমাণীকরণের চেষ্টা করা উচিত ।

এটি আপনাকে কিছু ক্রিয়াকলাপের প্রতি আরও সীমাবদ্ধ হতে বাধা দেয় না; [Authorize]অ্যাট্রিবিউট একটি হয়েছে AuthenticationSchemesসম্পত্তি যে আপনার ওভাররাইড করতে যা প্রমাণীকরণ স্কীম বৈধ পারেন।

আপনার যদি আরও জটিল পরিস্থিতি থাকে তবে আপনি নীতি-ভিত্তিক অনুমোদনের ব্যবহার করতে পারেন । আমি অফিসিয়াল ডকুমেন্টেশন দুর্দান্ত।

আসুন কল্পনা করুন যে কিছু ক্রিয়াগুলি কেবল ফায়ারবেস দ্বারা জারি করা জেডাব্লুটি টোকেনগুলিতে উপলব্ধ এবং নির্দিষ্ট মান সহ একটি দাবি থাকতে হবে; আপনি এটি এইভাবে করতে পারে:

// Authentication code omitted for brevity

services
    .AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes("Firebase", "Custom")
            .Build();

        options.AddPolicy("FirebaseAdministrators", new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .AddAuthenticationSchemes("Firebase")
            .RequireClaim("role", "admin")
            .Build());
    });

তারপরে আপনি [Authorize(Policy = "FirebaseAdministrators")]কিছু ক্রিয়া ব্যবহার করতে পারেন ।

একটি চূড়ান্ত বিষয় লক্ষণীয়: আপনি যদি AuthenticationFailedইভেন্টগুলি ধরছেন এবং প্রথম AddJwtBearerনীতি ব্যতীত অন্য কোনও কিছু ব্যবহার করছেন , আপনি দেখতে পাচ্ছেন যে IDX10501: Signature validation failed. Unable to match key...এটি AddJwtBearerম্যাচ না পাওয়া পর্যন্ত প্রতিটি সিস্টেমকে ঘুরে দেখার কারণে এটি ঘটে । ত্রুটিটি সাধারণত উপেক্ষা করা যায়।


4
এর জন্য কি ফায়ারবেস বা কাস্টম সমাধান থেকে শিরোনামের মান পরিবর্তন করা দরকার? অর্থাত্ এর পরিবর্তে Authorization : Bearer <token>শিরোনাম Authorization : Firebase <token>উদাহরণস্বরূপ হতে পারে ? এই সমাধানটি চেষ্টা করার পরে আমি ত্রুটি পেয়েছি: "'বেয়ার' স্কিমের জন্য কোনও প্রমাণীকরণ হ্যান্ডলার নিবন্ধিত নেই।"
রাশ ফ্রিসবি

4
না, শিরোনামগুলির পরিবর্তন করার দরকার নেই। ত্রুটি বার্তাটি পরামর্শ দেয় যে আপনি একটি অস্তিত্বহীন প্রমাণীকরণ স্কিম (বেয়ারার) উল্লেখ করছেন। আমাদের উদাহরণগুলিতে, দুটি নিবন্ধিত স্কিম হ'ল ফায়ারবেস এবং কাস্টম, যা .AddJwtBearerপদ্ধতি কলগুলির প্রথম যুক্তি ।
মিকৈল ডেরি

6
ওহে. শুধু এই সমাধান খুঁজছিলেন। দুর্ভাগ্যক্রমে আমি একটি "প্রমাণীকরণের কোনও শ্মশান নির্দিষ্ট করা হয়নি, এবং কোনও ডিফল্টচ্যালেনজ স্কিম পাওয়া যায় নি" ব্যতিক্রম পাচ্ছি। ডিফল্টপলিসি ঠিক আছে। কোন ধারনা?
টারজেটাইল

13
এটি একটি চূড়ান্ত সহায়ক উত্তর, এবং আমি পুরো জায়গা জুড়ে টুকরো টুকরো করে যা দেখেছি তা অনেকগুলি একসাথে রেখেছি।
অ্যারন ডাব্লু।

4
@ টাইলারহ্লসন যা সঠিক নয়; আপনার বর্ণনার ক্ষেত্রে এটি ব্যবহার করা হবে, কেবল এটিই নয়। আপনি যদি শেষ প্রান্তে অনুমোদনের প্রয়োজনীয়তা নির্দিষ্ট না করেন তবে এমভিসি নিয়ন্ত্রক এবং / অথবা ক্রিয়াকলাপকে খালি [Authorize]বৈশিষ্ট্য সহ সাজান তবে এটি ব্যবহার করা হবে ।
মিকৈল ডেরি

5

এটি মিকাআল ডেরির উত্তরের একটি বর্ধন।

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

const string Auth0 = nameof(Auth0);
const string MsaOpenId = nameof(MsaOpenId);

string domain = "https://myAuth0App.auth0.com/";
services.AddAuthentication()
        .AddJwtBearer(Auth0, options =>
            {
                options.Authority = domain;
                options.Audience = "https://myAuth0Audience.com";
            })
        .AddJwtBearer(MsaOpenId, options =>
            {
                options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                {
                    ValidateAudience = true,
                    ValidAudience = "00000000-0000-0000-0000-000000000000",

                    ValidateIssuer = true,
                    ValidIssuer = "https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0",

                    ValidateIssuerSigningKey = true,
                    RequireExpirationTime = true,
                    ValidateLifetime = true,
                    RequireSignedTokens = true,
                    ClockSkew = TimeSpan.FromMinutes(10),
                };
                options.MetadataAddress = "https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0/.well-known/openid-configuration";
            }
        );

services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .AddAuthenticationSchemes( Auth0, MsaOpenId )
        .Build();

    var approvedPolicyBuilder =  new AuthorizationPolicyBuilder()
           .RequireAuthenticatedUser()
           .AddAuthenticationSchemes(Auth0, MsaOpenId)
           ;

    approvedPolicyBuilder.Requirements.Add(new HasApprovedRequirement(domain));

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