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的自定义受权类
相关文章
相关标签/搜索