Authorization其目標就是驗證Http請求能否通過驗證。ASP.Net Core提供了很多種Authorization方式,詳細可以參考 微軟官方文檔。在這里只詳細介紹三種方式:
Policy
Middleware
Custom Attribute
一、Role授權
代碼如下:
#region jwt驗證 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"])) }; }); #endregion
在Claim中設置了Role
所以我們可以將 [Authorize] 標簽寫成[Authorize(Roles="admin")]
只有解析出來的token中的角色為admin才授權成功,才可以進入方法內,
在new Claim(ClaimTypes.Role, user) //包含類型為Role的Claim。
如果變量名user是Admin通過[Authorize(Roles="admin")]則驗證不通過,小寫的admin則通過,(區分大小寫)
二、Claims授權
1、要使用Claims授權,我們首先需要在Startup.cs的ConfigureServices方法中添加授權
授權代碼:
#region jwt驗證 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"])) }; }); #endregion #region 授權 services.AddAuthorization(options => { options.AddPolicy("EmployeeOnly", policy => { policy.RequireClaim("EmployeeNumber"); }); }); //如上,我們定義了一個名稱為EmployeeOnly的授權策略,它要求用戶的Claims中必須包含類型為EmployeeNumber的Claim。 #endregion
然后在CommonController.cs生成token的action中的Claim中添加EmployeeNumber
最后在需要權限認證的地方使用標簽 [Authorize(Policy="EmployeeOnly")]
我們首先獲取一下token,到jwt官網上解析一下發現token中包含EmployeeNumber
然后訪問成功
如果Claim不包含EmployeeNumber類型的,則訪問失敗。
訪問
三、自己定制JWT驗證(自定義Token獲取方式)
自定義類似jwt的token驗證,也就是說直接從header中拿取我們想要的token
1、Startup.cs中的ConfigureServices方法中注釋掉以下內容,然后自定義jwt token
代碼如下:
#region jwt驗證 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { /*options.TokenValidationParameters = new TokenValidationParameters { ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"])) };*/ #region 自定義Jwt的token驗證 options.SecurityTokenValidators.Clear();//將SecurityTokenValidators清除掉,否則它會在里面拿驗證 options.SecurityTokenValidators.Add(new MyTokenValidator()); //自定義的MyTokenValidator驗證方法 options.Events = new JwtBearerEvents { //重寫OnMessageReceived OnMessageReceived = context => { var token = context.Request.Headers["mytoken"]; context.Token = token.FirstOrDefault(); return Task.CompletedTask; } }; #endregion }); #endregion
2、接下來我們新建MyTokenValidator.cs類來驗證token,並讓這個類實現ISecurityTokenValidator接口
代碼如下:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; namespace ZanLveCore { public class MyTokenValidator : ISecurityTokenValidator { bool ISecurityTokenValidator.CanValidateToken => true; int ISecurityTokenValidator.MaximumTokenSizeInBytes { get; set; } bool ISecurityTokenValidator.CanReadToken(string securityToken) { return true; } //驗證token ClaimsPrincipal ISecurityTokenValidator.ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken) { validatedToken = null; //判斷token是否正確 if (securityToken != "abcdefg") return null; //給Identity賦值 var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme); identity.AddClaim(new Claim("name", "wyt")); identity.AddClaim(new Claim(ClaimsIdentity.DefaultRoleClaimType, "admin")); var principle = new ClaimsPrincipal(identity); return principle; } } }
訪問成功
Swagger UI訪問
其實這種驗證方式是 簡稱 清除驗證規則,自定義驗證方式
options.SecurityTokenValidators.Clear();//將SecurityTokenValidators清除掉,否則它會在里面拿驗證 options.SecurityTokenValidators.Add(new MyTokenValidator()); //自定義的MyTokenValidator驗證方法
還有一種方式是 簡稱 重寫驗證方式
權限授權Handler的繼承AuthorizationHandler的自定義授權類