ASP.NET Core WebAPI JWT Bearer 认证失败返回自定义数据 Json

问题

  • 应用场景:当前我们给微信小程序提供服务接口,接口中使用了权限认证这一块,当我使用 JWT Bearer 进行接口权限认证的时候,返回的结果不是我们客户端想要的,其它我们想要给客户端返回统一的数据结构,在结果中告知客户端是不是有权限即可,但是系统默认返回的是 401 Unauthorized 错误代码且不适用我们,所以我们将系统默认返回结果改变成我们自定义的数据结构,接下来看以下解决方法

  • 默认情况返回结果是这样子的 认证失败自定义数据 - 图1

  1. context.Response.Headers.Add("apiToken-Error", context.ErrorDescription);
  2. return Task.CompletedTask;

自定义

认证失败自定义数据 - 图2

  1. // 添加Jwt Bearer权限认证 Add by Jason.Song(成长的小猪) on 2019/04/09
  2. // 文章来源 http://blog.csdn.net/jasonsong2008
  3. services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  4. .AddJwtBearer(o =>
  5. {
  6. o.TokenValidationParameters =
  7. new TokenValidationParameters
  8. {
  9. IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(options.SecretKey)),
  10. ValidateIssuerSigningKey = true,
  11. ValidIssuer = options.ValidIssuer,
  12. ValidateIssuer = options.ValidateIssuer,
  13. ValidAudience = options.ValidAudience,
  14. ValidateAudience = options.ValidateAudience,
  15. ValidateLifetime = options.ValidateLifetime
  16. };
  17. o.Events = new JwtBearerEvents
  18. {
  19. //此处为权限验证失败后触发的事件
  20. OnChallenge = context =>
  21. {
  22. //此处代码为终止.Net Core默认的返回类型和数据结果,这个很重要哦,必须
  23. context.HandleResponse();
  24. //自定义自己想要返回的数据结果,我这里要返回的是Json对象,通过引用Newtonsoft.Json库进行转换
  25. var payload = JsonConvert.SerializeObject(new { Code = "401", Message = "很抱歉,您无权访问该接口;Jason.Song(成长的小猪)写了一个JWT权限验证失败后自定义返回Json数据对象,来源:https://blog.csdn.net/jasonsong2008" });
  26. //自定义返回的数据类型
  27. context.Response.ContentType = "application/json";
  28. //自定义返回状态码,默认为401 我这里改成 200
  29. context.Response.StatusCode = StatusCodes.Status200OK;
  30. //context.Response.StatusCode = StatusCodes.Status401Unauthorized;
  31. //输出Json数据结果
  32. context.Response.WriteAsync(payload);
  33. return Task.FromResult(0);
  34. }
  35. };
  36. });
  1. OnAuthenticationFailed = context =>
  2. {
  3. context.Response.StatusCode = HttpStatusCodes.AuthenticationFailed;
  4. context.Response.ContentType = "application/json";
  5. var err = this.Environment.IsDevelopment() ? context.Exception.ToString() : "An error occurred processing your authentication.";
  6. var result = JsonConvert.SerializeObject(new {err});
  7. return context.Response.WriteAsync(result);
  8. }