一款基於.NET Core的認證授權解決方案-葫蘆藤1.0開源啦

福祿網路技術團隊發表於2020-11-09

背景

18年公司準備在技術上進行轉型,而公司技術團隊是互相獨立的,新技術的推動阻力很大。我們需要找到一個切入點。公司的專案很多,而各個系統之間又不互通,導致每套系統都有一套登入體系,給員工和客戶都帶來極大的不便。那麼從登入切入進去無疑最合適,對於各個團隊的技術改造成本也不大。所以我們團隊第一個專案就是搭建一套統一登入認證授權系統,那麼葫蘆藤專案應運而生。

技術方案

後端框架:.NET Core3.1(後期會推出 .NET 5版本)

前端框架:React

資料庫:mysql(可根據實際情況,自由切換)

中介軟體:redis

詳細功能

認證授權服務

基於IdentityServer4實現的協議,支援網站、本地應用、移動端、web服務等應用的認證授權邏輯。

單點登入登出

支援各種型別應用上的單點登入登出。開箱即用的基礎使用者管理模組,包括:註冊、登入、手機驗證碼、忘記密碼等。為了安全考慮,整合了騰訊圖形驗證碼。

第三方登入(微信、釘釘)

完善的第三方登入支援。支援首次登入時繫結已存在使用者或註冊新使用者後,自動繫結。

如何快速使用

1.下載程式碼

clone程式碼到本地。根目錄結構如下:

20201103153907

其中,backend存放的是後端程式碼,frontend存放的是前端程式碼。

進入backend目錄,使用Visual Studio開啟解決方案。目錄結構如下:

20201103154250

2.生成資料庫

首先在Fulu.Passport.Web中找到appsettings.Development.json檔案。編輯資料庫連線字串:

20201103155350

開啟程式包管理器,切換預設專案為:Fulu.Passport.Web, 如下圖所示:

20201106111334

然後在程式包管理器中執行如下命令:


Add-Migration Init

最後執行完成後,再執行如下命令:

update-database

執行完以上操作後,如沒有報錯,則會建立資料庫,並會在Client表中建立一條測試資料,如下圖所示:

20201103160408

3.按F5啟動後端服務

注:由於專案中依賴redis來處理快取,所以正式啟動之前,需要將appsettings.Development.json檔案裡的redis配置改為你自己的。

4.啟動前端

切換目錄到frontend,在命令列中執行如下命令:

npm install

執行完畢後,執行如下命令:

npm run demo

執行結果如下圖所示:

20201103161300

然後通過http://localhost:8080進行訪問。介面如下所示:

20201103174200

至此,前後端服務已啟動完畢,一個開箱即用的認證授權服務就完成了。

5.新客戶端如何快速接入認證服務?

認證授權服務存在的意義就是提供統一的認證授權入口,有了這個服務後,每個新的客戶端應用無需單獨開發認證授權模組。下面就來一起看下如何快速將新應用接入到認證授權服務。(此處以 ASP.NET Core作為示例,其他語言大同小異)。

示例程式碼在sample資料夾中,如下圖所示:

20201104165955

在正式接入之前,必須先申請應用。(此版本未提供應用管理服務)通過在資料庫中新增示例資訊,如下圖所示:

20201104192124

示例sql指令碼:

INSERT INTO `fulusso`.`client`(`client_secret`, `full_name`, `host_url`, `redirect_uri`, `description`, `enabled`, `id`) VALUES ('14p9ao1gxu4q3sp8ogk8bq4gkct59t9w', '葫蘆藤2', 'http://localhost:5003/', 'http://localhost:5003', NULL, 1, UUID());

其中,redirect_uri引數指的是從認證服務獲取code之後,重定向的url。為了開發的方便,我們的認證服務中僅校驗回撥域名的域名,不會校驗完整的地址。比如,你的redirect_uri為http://www.xxx.com/abc/aaa,則資料庫中的redirect_uri欄位填寫http://www.xxx.com即可。

應用資訊匯入到資料庫後,在Startup類的ConfigureServices方法中,新增如下程式碼:

services.AddServiceAuthorize(o =>
{
    o.AllowClientToken = true;
    o.AllowUserToken = true;
    o.OnClientValidate = false;
    o.Authority = "http://localhost:5000";
    o.ValidateAudience = false;
    o.ClientId = Configuration["AppSettings:ClientId"];
    o.ClientSecret = Configuration["AppSettings:ClientSecret"];
});

注:需新增Fulu.Service.Authorize專案引用,如下圖所示:

20201104170401

然後在Configure方法中,新增如下程式碼:

 app.UseRouting();
 app.UseJwtAuthorize();
 app.UseAuthorization();

其中,UseJwtAuthorize是自定義的中介軟體,為了實現OAuth2.0的授權碼的邏輯。
限於篇幅,具體程式碼不在此列出。可在程式碼倉庫中檢視。

到此為止,這個新應用就成功的接入到認證服務了。

當未登入的時候,訪問此應用的頁面會自動跳轉到認證服務的login介面。登入之後,會重定向回登入之前的頁面。如下圖所示:

aa

下一版功能規劃

1.更多的第三方平臺的接入(QQ、微博等)

2.api授權服務

3.更安全的二次驗證,整合google令牌

4.應用管理

等等~~~~,盡請期待。

體驗

演示地址:https://account.suuyuu.cn/

程式碼倉庫:https://github.com/fuluteam/fulusso


如果覺得專案對於有所幫助,歡迎star。您的支援是我們持續更新的動力。

福祿ICH·架構組 福爾斯

相關文章