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

如何让ASP.NET Core对每个浏览器实例都要求身份验证?

解决方案:ASP.NET Core 6 MVC实现浏览器实例级身份验证

问题原因

Chrome的普通窗口/实例默认共享同一用户配置文件,因此认证Cookie会在实例间共享,导致新打开的浏览器实例无需重新登录即可访问授权资源。

代码修改步骤

1. 完善Cookie认证配置(Program.cs)

调整Cookie属性,确保会话Cookie仅在当前浏览器会话有效,同时增强安全性:

builder.Services.AddAuthentication(AuthModel.APP_AUTH_SCHEME)
    .AddCookie(AuthModel.APP_AUTH_SCHEME, options =>
    {
        options.LoginPath = new PathString("/account/logon");
        options.LogoutPath = new PathString("/account/logout"); // 补全合法的注销路径
        options.Cookie.Name = AuthModel.APP_AUTH_SCHEME;
        options.Cookie.SameSite = SameSiteMode.Strict;
        options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
        options.Cookie.HttpOnly = true; // 防止XSS攻击窃取Cookie
        options.Cookie.IsEssential = true; // 确保Cookie在隐私政策场景下正常工作
        options.Cookie.Expires = null; // 明确标记为会话Cookie,关闭浏览器即失效
        options.SlidingExpiration = true; // 用户操作时自动延长会话有效期
        options.ExpireTimeSpan = TimeSpan.FromMinutes(30); // 无操作30分钟后会话过期
    });
builder.Services.AddHttpContextAccessor();

2. 优化登录逻辑(Account控制器)

明确设置认证属性为非持久化,并指定会话过期时间:

var claims = new[] {
    new Claim(ClaimTypes.Name, model.UserName),
    new Claim(ClaimTypes.Role, "User")
};

var claimsIdentity = new ClaimsIdentity(claims, AuthModel.APP_AUTH_SCHEME);
await _httpContextAccessor.HttpContext.SignInAsync(AuthModel.APP_AUTH_SCHEME,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties() { 
        IsPersistent = false,
        ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(30),
        AllowRefresh = true // 支持滑动过期
    });

额外说明

HTTP Cookie本身按域名存储,无法区分同一浏览器的不同普通窗口。如果需要完全隔离每个浏览器实例的会话,只能依赖以下客户端操作:

  • 使用Chrome的隐身窗口(自动隔离Cookie)
  • 创建Chrome的多用户配置文件(不同用户配置间Cookie完全隔离)

若尝试服务器端辅助隔离,可通过JavaScript监听窗口关闭/焦点事件,主动向服务器发送注销请求,但这种方式无法覆盖用户直接关闭浏览器进程的场景,可靠性有限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:05:59