前言
本系列前三篇文章分別從ASP.NET Core認證的三個重要概念,到如何實現最簡單的登錄、注銷和認證,再到如何配置Cookie 選項,來介紹如何使用ASP.NET Core認證。感興趣的可以了解一下。
- ASP.NET Core Authentication系列(一)理解Claim, ClaimsIdentity, ClaimsPrincipal
- ASP.NET Core Authentication系列(二)實現認證、登錄和注銷
- ASP.NET Core Authentication系列(三)Cookie選項
這三篇文章都是從單應用角度來介紹如何使用ASP.NET Core認證,但是在實際開發中,往往都是多應用、分布式部署的,僅通過上面的內容沒辦法直接應用到多應用上。例如有3個應用,分別對應PC端、移動端和服務端,假設它們的域名分別為www.91suke.com,m.91suke.com以及service.91suke.com,如何讓這三個應用都共享認證。
本文將介紹如何通過共享授權Cookie來實現多應用間單點登錄(SSO)。
源碼下載地址:https://github.com/liang24/SSO
如何實現
前面我們已經解決了如何使用Cookie來實現認證功能,要實現共享授權Cookie還需要解決以下兩個問題:
- Cookie共享
- Cookie的認證票據的解析
第一個問題比較簡單,只要設置Cookie的域為根域,其他子域都能獲得這個Cookie。
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.Cookie.Name = "TestCookie"; //設置統一的Cookie名稱
options.Cookie.Domain = ".91suke.com"; //設置Cookie的域為根域,這樣所有子域都可以發現這個Cookie
});
第二個問題主要是讓多個應用共用解析算法,在ASP.NET Core里是通過services.AddDataProtection
配置數據加密保存方式。數據加密配置保存方式現階段ASP.NET Core支持:
- 保存到文件:PersistKeysToFileSystem
- 保存到數據庫:PersistKeysToDbContext
- 保存到Redis:PersistKeysToStackExchangeRedis
- 保存到Azure:PersistKeysToAzureBlobStorage
services.AddDataProtection()
//.PersistKeysToDbContext<SSOContext>() //把加密數據保存在數據庫
.PersistKeysToFileSystem(new DirectoryInfo(@"C:\server\share\directory\")) //把加密信息保存大文件夾
//.PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys")
.SetApplicationName("SSO"); //把所有子系統都設置為統一的應用名稱
使用PersistKeysToFileSystem
這個方法最簡單,就是把生成的票據保存到磁盤目錄上,多個應用同時訪問這個目錄,達到共享效果。
- 優點:實現簡單,只要應用有目錄權限即可,不需要再配置其他東西。
- 缺點:必須部署在同一台服務器上,無法分布式部署。
使用PersistKeysToDbContext
這個方法是把票據持久化到數據庫,應用只要有訪問數據庫的權限,就能達到共享效果。
- 優點:支持分布式部署。
- 缺點:在高並發場景下,數據庫IO將會是瓶頸;三種方式里實現的代碼量是最多的;
使用PersistKeysToStackExchangeRedis
這個方法是把票據保存到Redis緩存里,應用只要有訪問Redis的權限,就能達到共享效果。
- 優點:支持分布部署,高並發場景。
- 缺點:需要配置額外的緩存服務器。