Blazor多应用共享用户登录权限的可行性及实现方案问询
Blazor Identity 跨应用登录凭据共享方案
默认行为说明
同一IIS站点下的两个独立Blazor应用,默认不会自动共享登录凭据。哪怕它们共用同一个SQL数据库,每个应用的Identity配置都是独立的——Cookie名称、加密密钥等参数默认不统一,导致彼此无法识别对方生成的登录Cookie。
实现共享登录的具体步骤
因为两个应用已经共享数据库,核心是统一Cookie认证和数据保护配置,让双方能互相识别登录状态,同时保留各自的注册/登录入口。
1. 统一Identity基础配置
把Identity相关的实体(比如ApplicationUser)、数据库上下文ApplicationDbContext抽成一个独立的类库,让两个应用都引用这个类库,确保使用完全一致的用户模型和数据库访问逻辑。
然后在两个应用的Program.cs中,统一Cookie认证的关键参数:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { // 统一Cookie名称,两个应用必须完全一致 options.Cookie.Name = ".EnglishEdu.SharedAuth"; // 同一IIS站点下,Cookie路径设为根路径,确保全站有效 options.Cookie.Path = "/"; // 同一域名下无需指定Domain,设为null即可 options.Cookie.Domain = null; }); // 统一Identity配置,使用共享的用户实体和DbContext builder.Services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>();
2. 共享数据保护密钥
Blazor用数据保护系统加密登录Cookie,两个应用必须使用相同的加密密钥才能解密彼此的Cookie。有两种简单的实现方式:
- 本地文件共享(适合IIS部署):
在两个应用的Program.cs中配置数据保护,指向同一个本地文件夹(确保IIS应用池账户有读写权限):builder.Services.AddDataProtection() // 指定共享密钥的存储路径 .PersistKeysToFileSystem(new DirectoryInfo(@"D:\SharedAuthKeys")) // 统一应用名称,确保密钥分组一致 .SetApplicationName("EnglishEduPlatform"); - 云部署场景:可以用Azure密钥保管库或其他密钥管理服务存储密钥,两个应用配置相同的访问权限即可。
3. 同步中间件配置
两个应用的中间件顺序必须一致,确保认证先于授权:
app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 这两行顺序不能乱 app.UseAuthentication(); app.UseAuthorization(); app.MapRazorPages(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host");
4. 保留独立的注册/登录入口
游戏应用不需要移除自己的注册、登录页面,外部用户可以直接在游戏应用完成注册登录;而主站已登录的用户访问游戏应用时,系统会自动识别共享的Cookie,无需重复登录。
验证要点
- 主站登录后,直接访问游戏应用的受保护页面(比如需要登录才能进入的游戏模块),应该自动处于登录状态
- 在游戏应用注册新用户,用该账号登录主站,应该能正常访问主站的受保护内容
- 确保两个应用的.NET版本一致,避免数据保护算法不兼容导致的解密失败
内容的提问来源于stack exchange,提问作者Bennyboy1973
相关产品推荐
相关产品推荐

