一、感想
在寫這一系列文章之前,本來以為寫這個之前已經搭建好的框架描述會比較簡單,但是慢慢寫下來才發現。寫這個真的不簡單額,本來以為圖文一起,一個晚上應該能輸出一篇吧。。。結果:現實真的骨感,一個星期能輸出兩篇都不錯了。。
1.之前沒有寫過整體系列類的文章,從高考之后就基本上沒有寫長篇的文章了。
2.本系列文章主要定位面向是初中級的開發可以根據步驟來搭建,高級與架構主要是相互討論一下借鑒,所以很多東西寫得很簡單,基本上相當於是手把手教搭建的了
3.雖然自己之前的搭建已經完成了,但是從新來的時候好像有一些之前沒有考慮到的東西又要重新考慮一下加深了理解,從第4篇開始已經慢慢到了應用的層面,雖然基於abpvnext,但是並沒有完全基於。要寫這些的時候又要想着怎么寫得比較清晰,或者又怕自己理解不夠搞錯了。
4.現在大多數分享都是寫demo類,像這種直接拿整個解決方案的很少,同時架構這種又是不同的team有不同的解決方案。我只能寫我自己的用法,供參考吧。。
總知一句話:好難啊!!盡量堅持寫完整個框架搭建吧!!
搞完之后看下要不要基於這個架構再開個持續集成的新坑:k8s,jenkins,docker之類的持續集成方面的。
唉!慢慢寫吧。
二、簡要說明
源碼:https://github.com/lcjyslqyy/AbpVnext.Learn
由於我們在前面已經說明了,棄用id4的授權方法,因此在這里需要使用原始的jwt來做授權校驗。
本篇文章則是介紹JWT的接入,並根據自己的需要定義授權失敗的返回,取代原來的401狀態碼。關於JWT的介紹,網上很多文章已經描述得非常清晰了,我這里就不做過多的贅述了,大概是:前兩段是base64,誰都可以解碼的,最后一段是簽名用於和服務器的key和前兩段組合一個New string的簽名校驗;想要詳細了解的請跳轉:https://www.jianshu.com/p/576dbf44b2ae。
三、具體步驟
2.1 nuget在Host項目安裝:Microsoft.AspNetCore.Authentication.JwtBearer

在appsettings.json里面添加:
"JwtAuth": {
"Audience": "abpvnextlearn",
"Issuer": "abpvnextlearn",
"SecurityKey": "dzehzRz9a8+8TAGbqKHP9ITdRmZdOpJWQRsFb8oz50A=",//簽名的key
"TokenTime": 48
}
然后在LearnHttpApiHostModule注入AddAuthentication的授權服務,使用jwt校驗的方式:如下圖

則已經添加Jwt授權成功。
2.2校驗一下是否是可以正常授權了,
我們先增加一個LoginController,增加Logout的方法,增加Authorize屬性,如下圖在這里,注意一點:所有的方法都要添加方法屬性:如HttpPost,HttpGet等,不然在Swagger中是會拋出異常的。

這里我們看到swagger中有了logout的接口了,我們請求一下,接口返回了401狀態碼,是未授權狀態的描述。這里說明我們的jwt的校驗是添加成功的了。

2.3修改未授權的輸出。我們定義授權失敗返回{code="401",msg="無登錄信息或登錄信息已失效,請重新登錄"},由於我們后期所有的接口都遵循返回標准,code表示返回碼0為成功,msg為信息,data為數據。
因此授權失敗也要統一此標准,以便前端可以進行統一判斷。
需要在AddJwtBearer添加以下代碼:
options.Events = new JwtBearerEvents
{
OnChallenge = context =>
{
//此處代碼為終止.Net Core默認的返回類型和數據結果,這個很重要哦,必須
context.HandleResponse();
var payload = "{\"ret\":401,\"err\":\"無登錄信息或登錄信息已失效,請重新登錄。\"}";
//自定義返回的數據類型
context.Response.ContentType = "application/json";
context.Response.StatusCode = StatusCodes.Status200OK;
context.Response.WriteAsync(payload);
return Task.FromResult(0);
}
};
再次請求如下圖,表示我們替換成功了。

2.4接下來完善獲取jwt的請求Login,獲取jwt的流程,這里我如寫一些簡單的邏輯。如下圖:

然后登錄來獲取token,如下圖:

然后使用postman來校驗token是否合法:

返回正常,說明授權校驗已經通過了。
四、下一章介紹
定義統一的返回,與全局異常處理替換掉abpvnext原來的全局異常
