2、Core受權-2 之.net core 基於Jwt實現Token令牌(策略)

Authorization其目標就是驗證Http請求可否經過驗證。ASP.Net Core提供了不少種Authorization方式,詳細能夠參考 微軟官方文檔。在這裏只詳細介紹三種方式:ide

Policyui

Middlewarespa

Custom Attribute3d

1、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則經過,(區分大小寫)

2、Claims受權

一、要使用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類型的,則訪問失敗。

 訪問

 3、本身定製JWT驗證(自定義Token獲取方式)

自定義相似jwt的token驗證,也就是說直接從header中拿取咱們想要的tokencode

一、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

二、接下來咱們新建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訪問

 

 其實這種驗證方式是 簡稱 清除驗證規則,自定義驗證方式jwt

options.SecurityTokenValidators.Clear();//將SecurityTokenValidators清除掉,不然它會在裏面拿驗證
options.SecurityTokenValidators.Add(new MyTokenValidator()); //自定義的MyTokenValidator驗證方法

還有一種方式是 簡稱 重寫驗證方式
權限受權Handler的繼承AuthorizationHandler的自定義受權類
相關文章
相關標籤/搜索