应用场景:当前我们给微信小程序提供服务接口,接口中使用了权限认证这一块,当我使用 JWT Bearer 进行接口权限认证的时候,返回的结果不是我们客户端想要的,其它我们想要给客户端返回统一的数据结构,在结果中告知客户端是不是有权限即可,但是系统默认返回的是 401 Unauthorized 错误代码且不适用我们,所以我们将系统默认返回结果改变成我们自定义的数据结构,接下来看以下解决方法
// 添加Jwt Bearer权限认证 Add by Jason.Song(成长的小猪) on 2019/04/09 // 文章来源 http://blog.csdn.net/jasonsong2008 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(o => { o.TokenValidationParameters = new TokenValidationParameters { IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(options.SecretKey)), ValidateIssuerSigningKey = true, ValidIssuer = options.ValidIssuer, ValidateIssuer = options.ValidateIssuer, ValidAudience = options.ValidAudience, ValidateAudience = options.ValidateAudience, ValidateLifetime = options.ValidateLifetime }; o.Events = new JwtBearerEvents { //此处为权限验证失败后触发的事件 OnChallenge = context => { //此处代码为终止.Net Core默认的返回类型和数据结果,这个很重要哦,必须 context.HandleResponse(); //自定义自己想要返回的数据结果,我这里要返回的是Json对象,通过引用Newtonsoft.Json库进行转换 var payload = JsonConvert.SerializeObject(new { Code = "401", Message = "很抱歉,您无权访问该接口;Jason.Song(成长的小猪)写了一个JWT权限验证失败后自定义返回Json数据对象,来源:https://blog.csdn.net/jasonsong2008" }); //自定义返回的数据类型 context.Response.ContentType = "application/json"; //自定义返回状态码,默认为401 我这里改成 200 context.Response.StatusCode = StatusCodes.Status200OK; //context.Response.StatusCode = StatusCodes.Status401Unauthorized; //输出Json数据结果 context.Response.WriteAsync(payload); return Task.FromResult(0); } }; });
转自:https://blog.csdn.net/jasonsong2008/article/details/89226705