You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET MVC:如何实现关闭浏览器注销及30分钟超时注销

实现30分钟无操作自动注销 + 关闭浏览器立即注销的解决方案

没问题,这两个需求可以通过调整Cookie认证配置+结合你现有的登录代码轻松实现,咱们一步步来梳理:

1. 确保「关闭浏览器立即注销」生效

你已经在PasswordSignInAsync里把isPersistent(也就是model.Remember)设为false,这步完全正确!这个参数决定了登录Cookie是否是会话级Cookie——当设为false时,浏览器不会把Cookie持久化到本地磁盘,关闭浏览器就会自动清除它,直接满足「关闭浏览器立即注销」的需求。

2. 配置「30分钟无操作自动注销」

需要修改你Startup里的CookieAuthenticationOptions,添加两个关键配置项,同时调整安全戳验证的逻辑匹配这个时间:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    // 设置Cookie的有效期为30分钟,对应无操作自动注销的时长
    ExpireTimeSpan = TimeSpan.FromMinutes(30),
    // 启用滑动过期:用户每次有认证操作时,自动延长Cookie有效期
    SlidingExpiration = true,
    Provider = new CookieAuthenticationProvider
    {
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            // 安全戳验证间隔和Cookie有效期保持一致即可
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    }
});

3. 登录代码无需修改

你现有的登录代码已经完全符合要求,保持即可:

var result = await SignInManager.PasswordSignInAsync(
    model.UserName, 
    model.Password, 
    model.Remember, // 这里传false,确保是会话Cookie
    shouldLockout: false);

原理简单说明

  • 关闭浏览器注销isPersistent=false让Cookie变成会话Cookie,浏览器不持久化存储,关闭就删除。
  • 30分钟无操作注销ExpireTimeSpan设置Cookie的最长闲置时间,SlidingExpiration=true则会在用户有操作时自动刷新Cookie的有效期——如果30分钟内用户没动,Cookie过期,自然就需要重新登录了。

小提醒

测试的时候注意关闭浏览器的「恢复会话」功能(比如Chrome的“继续之前的会话”),不然浏览器重启后可能会自动恢复Cookie,导致看起来没注销哦。

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

火山引擎 最新活动