Blazor進階: Share authentication cookies for SSO

在 ASP.NET 應用程式中共用驗證 cookie, Share authentication cookies among ASP.NET apps, SSO.

參考文件

WHY

網站通常由個別 Web 應用程式共同作業所組成。 若要提供單一登入 (SSO) 體驗,網站內的 Web 應用程式必須共用驗證 cookie 。 為了支援此案例,資料保護堆疊允許共用 Katana cookie 驗證和 ASP.NET Core cookie 驗證票證。

關鍵資訊

SSO 實作的其中一個方案靠.AspNet.SharedCookie 來認證。方法是指定:

  1. 各 WebApp 指定以 Cookie Authentication。其中的 SameSiteMode 可能要從 Strict 下調成 Lax 才能共享。

  2. 各 WebApp 的 AuthCookie 的名稱必需相同,預設名稱:.AspNet.SharedCookie

  3. 各 WebApp 的 AuthCookie 必需共享相同的加密金鑰。以 PersistKeysToFileSystem 或相當的方法共享,比如:ProtectKeysWithCertificate 用憑證保護金鑰。

  4. 各 WebApp 需用 SetApplicationName 指定相同的 ApplicationName,如:SharedCookieApp

實作平台

平台:.NET6 IDE: Visual Studio 2022 骨架:Blazor Server App + Cookie Authentication

原始碼紀錄

Program.cs
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.DataProtection;

var builder = WebApplication.CreateBuilder(args);
IConfiguration config = builder.Configuration;

//# 與 ASP.NET Core 共用驗證 cookieIdentity
builder.Services.AddDataProtection()
  .PersistKeysToFileSystem(new DirectoryInfo(@"C:\Secure\SharedCookieApp\Protection"))
  .SetApplicationName("SharedCookieApp");

//## for BLAZOR COOKIE Auth
builder.Services.Configure<CookiePolicyOptions>(options =>
{
  options.CheckConsentNeeded = context => true;
  options.MinimumSameSitePolicy = SameSiteMode.Strict;
});
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
  .AddCookie(cfg =>
  {
    cfg.LoginPath = "/Accout/Login";
    cfg.Cookie.Name = ".AspNet.SharedCookie"; //default:.AspNetCore.Cookies
    cfg.Cookie.Path = "/";
  });

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();

//# 註冊:客製服務
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthenticationStateProvider>();
[...略...]

var app = builder.Build();
[...略...]

app.UseRouting();

//# for BLAZOR COOKIE Auth
app.UseCookiePolicy();
app.UseAuthentication();
app.UseAuthorization();

//## Endpoints
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

(EOF)

Last updated