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
來認證。方法是指定:
各 WebApp 指定以 Cookie Authentication。其中的 SameSiteMode 可能要從 Strict 下調成 Lax 才能共享。
各 WebApp 的 AuthCookie 的名稱必需相同,預設名稱:
.AspNet.SharedCookie
。各 WebApp 的 AuthCookie 必需共享相同的加密金鑰。以 PersistKeysToFileSystem 或相當的方法共享,比如:ProtectKeysWithCertificate 用憑證保護金鑰。
各 WebApp 需用 SetApplicationName 指定相同的 ApplicationName,如:SharedCookieApp。
依不同的執行平台或方法,如:.NET Core, .NET Framework 等等,Share authentication cookies 的指令不一定相同,不過原理是一樣的。
實作平台
平台:.NET6 IDE: Visual Studio 2022 骨架:Blazor Server App + Cookie Authentication
原始碼紀錄
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