当前位置:首页 > Web开发 > 正文

key可以自己随便起var claims = new[]{new Claim(JwtRegisteredClaimNam

2024-03-31 Web开发

标签:

[转]三分钟学会.NET Core Jwt 计谋授权认证 一.前言

  大家好我又回来了,前几天讲过一个关于Jwt的身份验证最简单的案例,但是成果还是不够强大,不适用于真正的项目,是的,在真正面对庞大而又苛刻的客户中,我们会不知所措,就此刻需要将认证授权这一块也变的庞大而又实用起来,那在专业术语中就叫做自界说计谋的API认证,本次案例运行在.NET Core 3.0中,最后我们将在swagger中进行浏览,来测验考试项目是否正常,对付.NET Core 2.x 版本,这篇文章有些代码不适用,但我会在文中说明。

二.在.NET Core中测验考试

  我们都知道Jwt是为了认证,微软给我们供给了进城打鬼子的城门,那就是 AuthorizationHandle。

  我们首先要实现它,并且我们还可以按照依赖注入的 AuthorizationHandlerContext 来获取上下文,就这样我们就更可以做一些权限的手脚

public class PolicyHandler : AuthorizationHandler<PolicyRequirement> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, PolicyRequirement requirement) { var http = (context.Resource as Microsoft.AspNetCore.Routing.RouteEndpoint); var questUrl = "/"+http.RoutePattern.RawText; //赋值用户权限 var userPermissions = requirement.UserPermissions; //是否颠末验证 var isAuthenticated = context.User.Identity.IsAuthenticated; if (isAuthenticated) { if (userPermissions.Any(u=>u.Url == questUrl)) { //用户名 var userName = context.User.Claims.SingleOrDefault(s => s.Type == ClaimTypes.NameIdentifier).Value; if (userPermissions.Any(w => w.UserName == userName)) { context.Succeed(requirement); } } } return Task.CompletedTask; } }

  首先,我们重写了 HandleRequirementAsync 要领,如果你看过AspNetCore的源码你必然知道,它是Jwt身份认证的初步,也就是说你重写了它,本来那一套就不会走了,我们不雅察看一下源码,我贴不才面,可以看到这就是一个最根基的授权,通过 context.Succeed(requirement 完成了最后的认证行动!

public class DenyAnonymousAuthorizationRequirement : AuthorizationHandler<DenyAnonymousAuthorizationRequirement>, IAuthorizationRequirement { /// <summary> /// Makes a decision if authorization is allowed based on a specific requirement. /// </summary> /// <param name="context">The authorization context.</param> /// <param name="requirement">The requirement to evaluate.</param> protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, DenyAnonymousAuthorizationRequirement requirement) { var user = context.User; var userIsAnonymous = user?.Identity == null || !user.Identities.Any(i => i.IsAuthenticated); if (!userIsAnonymous) { context.Succeed(requirement); } return Task.CompletedTask; } }

那么 Succeed 是一个什么呢?它是一个在 AuthorizationHandlerContext的界说行动,包孕Fail() ,也是如此,固然具体实现我们不在细谈,其内部还是挺庞大的,不过我们需要的是 DenyAnonymousAuthorizationRequirement 被看成了抽象的一部分。

public abstract class AuthorizationHandler<TRequirement> : IAuthorizationHandler where TRequirement : IAuthorizationRequirement {}

好吧,言归正传(看源码挺刺激的),我们刚刚在 PolicyHandler实现了自界说认证计谋,上面还说到了两个要领。此刻我们在项目中配置并启动它,并且我在代码中也是用了Swagger用于后面的演示。

在 AddJwtBearer中我们添加了jwt验证包孕了验证参数以及几个事件措置惩罚惩罚,这个很根基,不在解释。不过在Swagger中添加jwt的一些成果是在 AddSecurityDefinition 中写入的。

public void ConfigureServices(IServiceCollection services) { //添加计谋鉴权模式 services.AddAuthorization(options => { options.AddPolicy("Permission", policy => policy.Requirements.Add(new PolicyRequirement())); }) .AddAuthentication(s => { //添加JWT Scheme s.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; s.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; s.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) //添加jwt验证: .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateLifetime = true,//是否验证掉效时间 ClockSkew = TimeSpan.FromSeconds(30), ValidateAudience = true,//是否验证Audience //ValidAudience = Const.GetValidudience(),//Audience //这里给与动态验证的方法,在从头登陆时,刷新token,旧token就强制掉效了 AudienceValidator = (m, n, z) => { return m != null && m.FirstOrDefault().Equals(Const.ValidAudience); }, ValidateIssuer = true,//是否验证Issuer ValidIssuer = Const.Domain,//Issuer,这两项和前面签发jwt的设置一致 ValidateIssuerSigningKey = true,//是否验证SecurityKey IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Const.SecurityKey))//拿到SecurityKey }; options.Events = new JwtBearerEvents { OnAuthenticationFailed = context => { //Token expired if (context.Exception.GetType() == typeof(SecurityTokenExpiredException)) { context.Response.Headers.Add("Token-Expired", "true"); } return Task.CompletedTask; } }; }); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "HaoZi JWT", Description = "基于.NET Core 3.0 的JWT 身份验证", Contact = new OpenApiContact { Name = "zaranet", Email = "[email protected]", Url = new Uri(""), }, }); c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme() { Description = "不才框中输入请求头中需要添加Jwt授权Token:Bearer Token", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, BearerFormat = "JWT", Scheme = "Bearer" }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, new string[] { } } }); }); //认证处事 services.AddSingleton<IAuthorizationHandler, PolicyHandler>(); services.AddControllers(); }

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32785.html