先貼認證授權官方檔案 https://docs.microsoft.com/zh-cn/aspnet/core/security
認證:又叫身份驗證,由用戶提供憑據,然后將其與存盤在作業系統、資料庫、應用或資源中的憑據進行比較, 在授權程序中,如果憑據匹配,則用戶身份驗證成功,可執行已向其授權的操作,
授權:判斷允許用戶執行的操作的程序,
在需要身份驗證的web服務中,經常存在一個網站需要滿足多種身份驗證的需求,asp.net core 框架提供的認證授權功能已經支持這種操作;
日常可能有兩種情況:
1. 不同的認證token 訪問的介面不同,比如后臺管理的介面和前臺用戶的介面放在一個web 專案中,分別提供不同路由;
2. 不同的認證token 訪問的介面相同,比如前臺用戶認證有多種認證方式,都能訪問相同路由;
準備基礎代碼:
這里用兩個JWT認證模擬兩個不同的認證方案 AuthSettings.AdminScheme 、 AuthSettings.UserScheme
builder.Services.AddAuthentication(AuthSettings.AdminScheme) .AddJwtBearer(AuthSettings.AdminScheme, options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = false, ValidateIssuerSigningKey = true, ValidIssuer = AuthSettings.AdminIssuer, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AuthSettings.AdminSecret)) }; }) .AddJwtBearer(AuthSettings.UserScheme, options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = false, ValidateIssuerSigningKey = true, ValidIssuer = AuthSettings.UserIssuer, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AuthSettings.UserSecret)) }; });
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
1. 不同的認證token 訪問的介面不同
對于情況1,我們一般直接在 options.ForwardDefaultSelector 寫上獲取認證方案的邏輯就能實作動態切換認證方案,你可以根據路由地址,header 引數等自定義你想要執行的認證方案
builder.Services.AddAuthentication(AuthSettings.AdminScheme) .AddJwtBearer(AuthSettings.AdminScheme, options => {//動態轉發方案 options.ForwardDefaultSelector = content => { return content.Request.Path.Value!.Contains(AuthSettings.UserUrlBase) ? AuthSettings.UserScheme : null; }; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = false, ValidateIssuerSigningKey = true, ValidIssuer = AuthSettings.AdminIssuer, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AuthSettings.AdminSecret)) }; }) .AddJwtBearer(AuthSettings.UserScheme, options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = false, ValidateIssuerSigningKey = true, ValidIssuer = AuthSettings.UserIssuer, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AuthSettings.UserSecret)) }; });
當然,如果你不想這樣操作,也有針對介面的操作,你只需要在介面處申明你要執行的認證方案就行
[HttpGet("test4")] [Authorize(AuthenticationSchemes = AuthSettings.UserScheme)] public async Task<IActionResult> Test4() { return new JsonResult(new { Code = "OK" }) { StatusCode = (int)HttpStatusCode.OK }; }
當然也有針對授權策略的認證方案指定
builder.Services.AddAuthorization(options => {
options.AddPolicy("ClaimNamePolicy", options => {
options.AuthenticationSchemes = new[] { AuthSettings.UserScheme };
options.RequireClaim("ClaimName", "test2");
});
});
[HttpGet("test3")]
[Authorize("ClaimNamePolicy")]
public async Task<IActionResult> Test3()
{
return new JsonResult(new { Code = "OK" }) { StatusCode = (int)HttpStatusCode.OK };
}
以上三種方式都可以指定你想要的認證方案;
2. 不同的認證token 訪問的介面相同
對于不同的認證token 訪問相同介面,我們一般直接重新配置默認的授權策略,指定多個方案即可
builder.Services.AddAuthorization(options => {
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.AddAuthenticationSchemes(new string[] { AuthSettings.UserScheme, AuthSettings.AdminScheme })
.Build();
});
使用比較簡單,但是里面有很多框架的邏輯需要理解,想要深入研究的,建議去看看 asp.net core 原始碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/415171.html
標籤:.NET技术
上一篇:WPF_15_格式化系結的資料
