ASP.NET Core 2.2 JWT AUTH
发布时间:2020-12-16 09:27:28 所属栏目:asp.Net 来源:网络整理
导读:为什么需要JWT CORS+COOKIE认证无法进行跨根域传认证cookie导致登陆失败,这个问题暂时没有解决办法(2019-8-7),测试(EDGE DEV,EDGE 可以,但是CHROME没办法SET-cookie) 前后端分离,开发采用的是不同IP,基于headers传TOKEN扩展性更好 DOTNET 对于JWT的
为什么需要JWT
DOTNET 对于JWT的支持头文件需要using Microsoft.IdentityModel.Tokens; //生成jwt token using Microsoft.AspNetCore.Authentication.JwtBearer; // jwt auth 认证,需要用negut包安装 using Microsoft.AspNetCore.Authorization; // 认证 using System.Security.Claims; // 声明身份 using Microsoft.IdentityModel.Tokens; //Tokens using System.Text; //编码 jwt token 生成using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authentication; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; namespace authtest.Controllers { [Route("[controller]/[action]")] public class JwtAuthController : Controller { public IActionResult Login() { var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub,"test"),new Claim(JwtRegisteredClaimNames.Jti,Guid.NewGuid().ToString()),new Claim(ClaimTypes.Role,"user"),new Claim("org","true") }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("test6666666666666666666")); var creds = new SigningCredentials(key,SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken(null,null,claims,expires: DateTime.Now.AddMinutes(30),signingCredentials: creds); var test = new JwtSecurityTokenHandler().WriteToken(token); return Json(test); } } } 自定义策略验证方式(Policy = "")/// <summary> /// 用户认证需求 /// </summary> internal class UserRequirement : IAuthorizationRequirement { public string UserIdentity { get; private set; } public UserRequirement(string UserIdentityName) { UserIdentity = UserIdentityName; } } /// <summary> /// 使用的用户认证方法 /// </summary> internal class UserAuthorizationHandler: AuthorizationHandler<UserRequirement> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,UserRequirement requirement) { try { if (context.User.FindFirst(requirement.UserIdentity).Value.Equals("true")) { context.Succeed(requirement); } else { context.Fail(); } } catch { context.Fail(); } return Task.CompletedTask; } } startUp.cs 服务里添加服务services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(option => { option.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("test6666666666666666666")),ValidateAudience = false,ValidateIssuer = false,ValidateIssuerSigningKey = true,// 签名校对 ValidateLifetime = true,// 时间校对 }; }); services.AddAuthorization(options => { options.AddPolicy("org",policy => { policy.Requirements.Add(new UserRequirement("org")); }); options.AddPolicy("std",policy => { policy.Requirements.Add(new UserRequirement("std")); }); options.AddPolicy("head",policy => { policy.Requirements.Add(new UserRequirement("head")); }); }); 最后只要再需要权限验证的接口上添加特性[Authorize(Policy="{可以是org可以是std可以是head}")] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 通过ASP.NET菜单控件禁用javascript生成
- asp.net-mvc – mvc视图中的条件逻辑vs htmlhelper vs acti
- asp.net – Route属性上的RouteOrder属性在哪里?
- asp.net – 哪个会员提供程序实现存储在web.config中的用户
- 使用ASP.NET Identity实现基于声明的授权,高级篇
- 什么是ASP.NET中的gpstate文件
- asp.net-mvc – 需要经过身份验证的用户的Ajax调用操作方法
- 如何使用Castle Windsor与ASP.Net Web表单?
- asp.net – NVelocity没有找到模板
- asp.net-mvc-3 – MVC3,Unity Framework和Per Session Life
推荐文章
站长推荐
热点阅读