Cookie管理后台管理,JWT对外提供接口验证
具体官方文档链接 使用 ASP.NET Core 中的特定方案授权
实现思路:
1.添加两种授权方式配置, AddAuthentication 的参数 defaultScheme 使用默认值,不进行赋值
2.对鉴权如有自定义策略,需要指定 AuthenticationSchemes
3.action的鉴权特性需要指明 AuthenticationSchemes
大体代码如下
services.AddAuthentication().AddCookie(option => { option.Cookie.HttpOnly = true; option.LoginPath = new PathString("/Login/Index"); option.AccessDeniedPath = new PathString("/Login/Privacy");//无权限跳转地址 }).AddJwtBearer(option => { option.TokenValidationParameters = new TokenValidationParameters() { ValidateIssuer = false,//验证颁发者 ValidateAudience = false,//是否验证Audience ValidateLifetime = true,//是否验证失效时间 ValidateIssuerSigningKey = true,//是否验证SecurityKey // ValidAudience = "https://localhost:5001/",// // ValidIssuer = "https://localhost:5001/",//Issuer,这两项和前面签发jwt的设置一致 IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("12345678901qaz2wsx")),//拿到SecurityKey }; });
services.AddAuthorization(option => { //自定义策略 option.AddPolicy("CustomPolicy", policy => { policy.AuthenticationSchemes.Add(CookieAuthenticationDefaults.AuthenticationScheme); var customRequirement = new CustomRequirement() { PowerList = new List<RoleMenu>() }; //此处需要从数据库获取权限集合,并注入单例,这样就可以在权限修改后对此单例直接修改权限集合 //测试数据 customRequirement.PowerList.Add( new RoleMenu() { RoleId = "ceshi", Url = "/home/Index" } ); policy.Requirements.Add(customRequirement); }); });
鉴权action
/// <summary> /// Cookie 校验 /// </summary> /// <returns></returns> [Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)] public IActionResult Index2() { Console.WriteLine(User.Claims.FirstOrDefault(t => t.Type == "time").Value); return View(); } /// <summary> /// JWT 校验 /// </summary> /// <returns></returns> [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] public IActionResult Index3() { Console.WriteLine(User.Claims.FirstOrDefault(t => t.Type == "time").Value); return Ok(User.Claims.FirstOrDefault(t=>t.Type== "time").Value); }
JWT Claims
iss 【issuer】发布者的url地址
sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段
aud 【audience】接受者的url地址
exp 【expiration】 该jwt销毁的时间;unix时间戳
nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳
iat 【issued at】 该jwt的发布时间;unix 时间戳
jti 【JWT ID】 该jwt的唯一ID编号