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

AddMicrosoftIdentityWebApp能否实现用户持久登录及滑动有效期设置?

实现长期记住用户的OpenID Connect认证方案

首先得明确:OpenIdConnectOptions.MaxAge不是用来实现“长期记住用户”的选项,它的作用是强制用户在指定时间内必须重新输入密码验证身份,哪怕你有有效的登录凭证也不行。微软组件里它默认上限1天,是因为身份令牌(ID Token)本身就是短期凭证,设计用来做初始认证,不是维持长期登录的。

要实现“记住用户+滑动窗口”(用户活跃就自动续期,不用频繁登录),核心靠**认证Cookie + 刷新令牌(Refresh Token)**配合,下面是具体步骤:

1. 配置长期认证Cookie并开启滑动过期

微软的Cookie认证组件是维持本地登录状态的核心,你可以直接调整它的有效期和滑动规则:

  • 设置ExpireTimeSpan为你想要的时长(比如7天),这是Cookie的默认有效期。
  • 开启SlidingExpiration = true,只要用户在网站上有活跃操作(比如点击页面、提交表单),Cookie的有效期就会自动往后顺延,实现“滑动窗口”效果。
  • 关键要开启SaveTokens = true,把身份提供商发的刷新令牌存在Cookie里,这样ID Token过期后,系统会自动用刷新令牌去换全新的ID Token,不用用户手动登录。

示例代码:

services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
    options.ExpireTimeSpan = TimeSpan.FromDays(7); // 设为7天有效期
    options.SlidingExpiration = true; // 活跃就自动续期
    options.LoginPath = "/Account/Login";
    // 安全配置:Cookie必须用HTTPS传输,禁止JS读取
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
    options.Cookie.HttpOnly = true;
    options.Cookie.SameSite = SameSiteMode.Strict;
})
.AddOpenIdConnect(options =>
{
    // 这里填你的OIDC配置,比如Authority、ClientId、ClientSecret等
    options.Authority = "https://your-identity-provider.com";
    options.ClientId = "your-client-id";
    options.ClientSecret = "your-client-secret";
    options.ResponseType = "code";

    options.SaveTokens = true; // 必须开启:保存刷新令牌到Cookie
    options.RemoteAuthenticationTimeout = TimeSpan.FromDays(7); // 和Cookie有效期对齐
    // 不用特意设置MaxAge,或者设为比Cookie短的时间(比如1天),确保每天验证一次ID Token,但靠刷新令牌自动续期
});

2. 调整身份提供商的刷新令牌规则

刷新令牌是身份提供商(比如Azure AD、AD FS)签发的,它的有效期和续期规则由提供商控制:

  • 登录到你的身份提供商管理后台(比如Azure Portal的应用注册),找到令牌配置选项,把刷新令牌的生命周期设为你需要的时长(比如90天甚至1年)。
  • 开启滑动刷新功能(部分提供商支持):只要用户在刷新令牌过期前有活跃操作,系统会自动签发一个新的刷新令牌,实现“理论上只要用户常登录就不用重新认证”的效果。

3. 关于MaxAge的正确用法

如果你的需求是“用户即使活跃,也必须每隔N天重新输入密码”,那才需要设置MaxAge。比如你设MaxAge = TimeSpan.FromDays(30),那不管用户有没有活跃,30天后必须重新登录验证身份。但这和你要的“滑动窗口免登录”是冲突的,所以这种场景下不用设置MaxAge。

安全提醒

长期登录凭证有被盗风险,务必做好以下防护:

  • 网站全程用HTTPS传输,防止Cookie被窃听。
  • 开启Cookie的HttpOnly、Secure、SameSite=Strict属性,避免XSS和CSRF攻击。
  • 提供明确的注销功能,让用户可以主动清除登录凭证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:35:10