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

背景

18年公司準備在技術上進行轉型,而公司技術團隊是互相獨立的,新技術的推進阻力很大。咱們須要找到一個切入點。公司的項目不少,而各個系統之間又不互通,致使每套系統都有一套登陸體系,給員工和客戶都帶來極大的不便。那麼從登陸切入進去無疑最合適,對於各個團隊的技術改形成本也不大。因此咱們團隊第一個項目就是搭建一套統一登陸認證受權系統,那麼葫蘆藤項目應運而生。前端

技術方案

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

前端框架:Reactgit

數據庫:mysql(可根據實際狀況,自由切換)github

中間件:redisweb

詳細功能

認證受權服務

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

單點登陸登出

支持各類類型應用上的單點登陸登出。開箱即用的基礎用戶管理模塊,包括:註冊、登陸、手機驗證碼、忘記密碼等。爲了安全考慮,集成了騰訊圖形驗證碼。sql

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

完善的第三方登陸支持。支持首次登陸時綁定已存在用戶或註冊新用戶後,自動綁定。數據庫

如何快速使用

1.下載代碼

clone代碼到本地。根目錄結構以下:npm

20201103153907

其中,backend存放的是後端代碼,frontend存放的是前端代碼。json

進入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。您的支持是咱們持續更新的動力。

相關文章
相關標籤/搜索