ASP.NET Core Authentication系列(四)基於Cookie實現多應用間單點登入(SSO)

大雜草發表於2020-11-04

前言

本系列前三篇文章分別從ASP.NET Core認證的三個重要概念,到如何實現最簡單的登入、登出和認證,再到如何配置Cookie 選項,來介紹如何使用ASP.NET Core認證。感興趣的可以瞭解一下。

這三篇文章都是從單應用角度來介紹如何使用ASP.NET Core認證,但是在實際開發中,往往都是多應用、分散式部署的,僅通過上面的內容沒辦法直接應用到多應用上。例如有3個應用,分別對應PC端、移動端和服務端,假設它們的域名分別為www.91suke.com,m.91suke.com以及service.91suke.com,如何讓這三個應用都共享認證。

本文將介紹如何通過共享授權Cookie來實現多應用間單點登入(SSO)。

原始碼下載地址:https://github.com/liang24/SSO

如何實現

前面我們已經解決了如何使用Cookie來實現認證功能,要實現共享授權Cookie還需要解決以下兩個問題:

  1. Cookie共享
  2. 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的許可權,就能達到共享效果。

  • 優點:支援分佈部署,高併發場景。
  • 缺點:需要配置額外的快取伺服器。

參考資料

相關文章