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

فرض کنید که دو روش احراز هویت متفاوت در برنامه 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]) یا ... استفاده کنیم.