You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Server集成Microsoft Identity:如何实现独立登录会话?

解决方案

这些需求完全可以实现,核心是调整ASP.NET Core Identity的Cookie配置,并结合Blazor Server的会话隔离特性处理跨标签页/窗口的共享问题:

1. 解决「关闭浏览器后需重新登录」的问题

将Identity的认证Cookie设置为会话级Cookie,关闭浏览器时自动清除:

在Program.cs中添加Cookie配置:

builder.Services.ConfigureApplicationCookie(options =>
{
    // 设置会话超时(无操作30分钟后过期,可按需调整)
    options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
    // 用户活动时自动延长超时
    options.SlidingExpiration = true;
    // 关键:禁用持久化,Cookie仅在当前浏览器会话有效
    options.Cookie.IsPersistent = false;
    // 安全配置(生产环境必须开启HTTPS)
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
    options.Cookie.HttpOnly = true;
});

此配置会让Cookie在浏览器关闭时自动删除,重新打开站点必须重新登录。

2. 实现「新标签页/窗口默认未登录」的需求

浏览器默认共享同一配置文件下的Cookie,要隔离标签页/窗口的会话,可通过以下两种方式实现:

方式一:启用Cookie分区(推荐,现代浏览器支持)

利用浏览器的Cookie分区特性,将认证Cookie绑定到当前标签页上下文,不跨标签页共享:

在上述Cookie配置中添加:

options.Cookie.Partitioned = true;
options.Cookie.SameSite = SameSiteMode.Strict;

注意:该特性需Chrome 89+、Edge 89+等现代浏览器支持,且必须配合HTTPS环境(SecurePolicy=Always)。

方式二:基于Blazor Circuit隔离会话(兼容旧浏览器)

如果需要兼容不支持Cookie分区的浏览器,可将认证状态存储在Blazor Server的Circuit中,而非Cookie:

  1. 创建自定义AuthenticationStateProvider,将用户认证信息存储在当前Circuit的CircuitState中。
  2. 登录页面验证凭据后,将认证信息写入当前Circuit的状态。
  3. 修改_Host.cshtml,仅读取当前Circuit的认证状态,不依赖Cookie自动登录:
@if (!HttpContext.User.Identity.IsAuthenticated || !CircuitHandler.HasValidSession())
{
    <div class="auth-container">
        <h3>请登录</h3>
        <a asp-area="Identity" asp-page="/Account/Login" class="btn btn-primary">登录</a>
    </div>
}
else
{
    <component type="typeof(App)" render-mode="Server" />
}

这种方案完全隔离不同标签页的会话,但需处理页面刷新时的状态恢复(可结合短期会话Cookie存储Circuit ID,关闭浏览器即失效)。

效果验证

完成配置后:

  • 关闭浏览器重新打开,Cookie已清除,需主动登录。
  • 新标签页/窗口打开时,因Cookie分区或Circuit隔离,默认处于未登录状态,可使用任意账号重新登录。

内容的提问来源于stack exchange,提问作者haPartnerships

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:00:19