開發環境:ASP.NET Core Web API
目標框架:.NET Core 2.2
權限認證:JWT Bearer
提供者:成長的小豬 Jason Song
應用場景:當前我們給微信小程序提供服務接口,接口中使用了權限認證這一塊,當我使用 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);
}
};
});