一款基於.NET Core的認證授權解決方案-葫蘆藤1.0開源啦
背景
18年公司準備在技術上進行轉型,而公司技術團隊是互相獨立的,新技術的推動阻力很大。我們需要找到一個切入點。公司的項目很多,而各個系統之間又不互通,導致每套系統都有一套登錄體系,給員工和客戶都帶來極大的不便。那麼從登錄切入進去無疑最合適,對於各個團隊的的技術改造成本也不大。所以我們團隊第一個項目就是搭建一套統一登錄認證授權系統,那麼葫蘆藤項目應運而生。
技術方案
後端框架:.NET Core3.1(後期會推出 .NET 5版本)
前端框架:rect
資料庫:mysql(可根據實際情況,自由切換)
中間件:redis
詳細功能
認證授權服務
基於IdentityServer4實現的協議,支援網站、本地應用、移動端、web服務等應用的認證授權邏輯。
單點登錄登出
支援各種類型應用上的單點登錄登出。開箱即用的基礎用戶管理模組,包括:註冊、登錄、手機驗證碼、忘記密碼等。為了安全考慮,繼承了騰訊圖形驗證碼。
第三方登錄(微信、釘釘)
完善的第三方登錄支援。支援首次登錄時綁定已存在用戶或註冊新用戶後,自動綁定。
如何快速使用
1.下載程式碼
clone程式碼到本地。根目錄結構如下:
其中,backend存放的是後端程式碼,frontend存放的是前端程式碼。
進入backend目錄,使用Visual Studio打開解決方案。目錄結構如下:
2.生成資料庫
首先在Fulu.Passport.Web中找到appsettings.Development.json文件。編輯資料庫連接字元串:
打開程式包管理器,切換默認項目為:Fulu.Passport.Web, 如下圖所示:
然後在程式包管理器中執行如下命令:
Add-Migration Init
最後執行完成後,再執行如下命令:
update-database
執行完以上操作後,如沒有報錯,則會創建資料庫,並會在Client表中創建一條測試數據,如下圖所示:
3.按F5啟動後端服務
註:由於項目中依賴redis來處理快取,所以正式啟動之前,需要將appsettings.Development.json文件里的redis配置改為你自己的。
4.啟動前端
切換目錄到frontend,在命令行中執行如下命令:
npm install
執行完畢後,執行如下命令:
npm run demo
執行結果如下圖所示:
然後通過//localhost:8080進行訪問。介面如下所示:
至此,前後端服務已啟動完畢,一個開箱即用的認證授權服務就完成了。
5.新客戶端如何快速接入認證服務?
認證授權服務存在的意義就是提供統一的認證授權入口,有了這個服務後,每個新的客戶端應用無需單獨開發認證授權模組。下面就來一起看下如何快速將新應用接入到認證授權服務。(此處以 ASP.NET Core作為示例,其他語言大同小異)。
示例程式碼在sample文件夾中,如下圖所示:
在正式接入之前,必須先申請應用。(此版本未提供應用管理服務)通過在資料庫中添加示例資訊,如下圖所示:
示例sql腳本:
INSERT INTO `fulusso`.`client`(`client_secret`, `full_name`, `host_url`, `redirect_uri`, `description`, `enabled`, `id`) VALUES ('14p9ao1gxu4q3sp8ogk8bq4gkct59t9w', '葫蘆藤2', '//localhost:5003/', '//localhost:5003', NULL, 1, UUID());
其中,redirect_uri參數指的是從認證服務獲取code之後,重定向的url。為了開發的方便,我們的認證服務中僅校驗回調域名的域名,不會校驗完整的地址。比如,你的redirect_uri為//www.xxx.com/abc/aaa,則資料庫中的redirect_uri欄位填寫//www.xxx.com即可。
應用資訊導入到資料庫後,在Startup類的ConfigureServices方法中,添加如下程式碼:
services.AddServiceAuthorize(o =>
{
o.AllowClientToken = true;
o.AllowUserToken = true;
o.OnClientValidate = false;
o.Authority = "//localhost:5000";
o.ValidateAudience = false;
o.ClientId = Configuration["AppSettings:ClientId"];
o.ClientSecret = Configuration["AppSettings:ClientSecret"];
});
註:需添加Fulu.Service.Authorize項目引用,如下圖所示:
然後在Configure方法中,添加如下程式碼:
app.UseRouting();
app.UseJwtAuthorize();
app.UseAuthorization();
其中,UseJwtAuthorize是自定義的中間件,為了實現OAuth2.0的授權碼的邏輯。
限於篇幅,具體程式碼不在此列出。可在程式碼倉庫中查看。
到此為止,這個新應用就成功的接入到認證服務了。
當未登錄的時候,訪問此應用的頁面會自動跳轉到認證服務的login介面。登錄之後,會重定向回登錄之前的頁面。如下圖所示:
下一版功能規劃
1.更多的第三方平台的接入(QQ、微博等)
2.api授權服務
3.更安全的二次驗證,集成google令牌
4.應用管理
等等~~~~,盡請期待。
體驗
演示地址://account.suuyuu.cn/
程式碼倉庫://github.com/fuluteam/fulusso