ترکیب دو روش احراز هویت در ASP.NET Core

mohsen2 ماه قبل2 ماه قبل
ارسال شده در
mohsen

فرض کنید که دو روش احراز هویت متفاوت در برنامه ASP.NET Core تعریف کردیم. یکی بوسیله JWT و دیگری روش اختصاصی. هر دو روش توکنی را از طریق هدر Authorization بررسی می کنند که به صورت زیر است:

      Bearer token_value
    

حال می خواهیم روی اندپوینتی مشخص هر دو روش را اعمال کنیم، به صورتی که بوسیله هر کدام از روش ها کاربر احراز هویت شد، امکان دسترسی به اندپوینت را داشته باشد.

برای این کار دو روش وجود دارد:

1. استفاده از Policy

برای این کار کافی است یک پالیسی تعریف کنیم و هر دو شما را به شماهای احراز هویت اضافه کنیم:

      services.AddAuthorization(options =>
{
    options.AddPolicy("mixed", policy =>
    {
        policy.AuthenticationSchemes.Clear();
        policy.AddAuthenticationSchemes("TokenAuthentication", JwtBearerDefaults.AuthenticationScheme)
            .RequireAuthenticatedUser();
    });
});
    

و اندپوینت ما کافی است به صورت زیر تعریف شود:

      app.MapPost("/api/do-something", DoSomethingAsync)
            .RequireAuthorization("mixed");
    

2. استفاده از AddPolicyScheme

راه دوم استفاده از اکستنشن متد AddPolicyScheme  و تعریف فورواردر بوسیله تنظیمات ForwardDefaultSelector است. این تنظیمات کمک می کند بر اساس، متد احراز هویت را مشخص کنیم. مثلن شمای TokenAuthentication در این مثال انتظار دریافت هدر Authorization به صورت زیر است:

      Token token_value
    

بر همین اساس در تنظمیات ForwardDefaultSelector ، اگر هدر Authorization با مقدار Token شروع میشد ما متد TokenAuthorization را برای احراز هویت انتخاب می کنیم و در غیر اینصورت متد Jwt را.

      builder.Services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        // تنظیمات توکن
    })
.AddAuthentication("TokenAuthentication")
    .AddScheme<AuthenticationSchemeOptions, TokenAuthenticationHandler>("TokenAuthentication", null)
    .AddPolicyScheme("MultipleAuthentication", "", options =>
    {
        options.ForwardDefaultSelector = context =>
        {
            var authHeader = context.Request.Headers["Authorization"].FirstOrDefault();
            if (authHeader?.StartsWith("Token ") == true)
                return "TokenAuthentication";
            return JwtBearerDefaults.AuthenticationScheme;
        };
    });

services.AddAuthorization(options =>
{
    options.AddPolicy("mixed", policy =>
    {
        policy.AuthenticationSchemes.Clear();
        policy.AddAuthenticationSchemes("MultipleAuthentication")
            .RequireAuthenticatedUser();
    });
});
    

اگر بخواهیم در این روش نیز مانند روش قبل از Bearer برای TokenAuthentication استفاده کنیم باید راه دیگری مانند قرار دادن مقدار خاص در ابتدای توکن (mytoken_[token]) یا ... استفاده کنیم.

رای
0
ارسال نظر
مرتب سازی:
اولین نفری باشید که نظر می دهید!