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

ASP.NET Core OIDC认证:Cookie与ID Token同步及令牌刷新问题

ASP.NET Core OIDC令牌过期后的处理指南

先明确基础前提:当开启SaveTokens = true时,access_token、refresh_token、id_token会存储在认证Cookie中,令牌过期后Cookie会话仍保持有效,此时需按以下逻辑处理:

一、令牌过期后需执行的操作

  • 调用OIDC服务器的令牌刷新端点,用已保存的refresh_token换取新的access_token、id_token(部分服务商还会返回新的refresh_token)
  • 验证新令牌的签名与有效性,确保来源合法
  • 更新Cookie中存储的令牌数据,替换过期的旧令牌
  • 若刷新失败(比如refresh_token也过期、服务器拒绝请求),则强制用户重新完成认证

二、令牌刷新的执行时机:HTTP请求上下文内,而非后台任务

绝对不推荐用后台任务处理令牌刷新,原因如下:

  • 后台任务无法关联到具体用户的Cookie会话,拿不到对应用户的refresh_token
  • 令牌刷新和用户请求强绑定——只有用户发起请求时才需要有效令牌,此时在请求流程中处理刷新,能保证当前请求可用新令牌
  • 实践中可通过自定义认证中间件或动作过滤器,在请求进入业务逻辑前检查令牌过期时间,提前(比如过期前5分钟)或在令牌已过期时自动触发刷新

三、刷新结果对应的Cookie更新逻辑

刷新成功时

通过IAuthenticationService重新完成登录流程,将新令牌写入Cookie:

// 获取当前认证状态
var authResult = await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);
if (authResult.Succeeded)
{
    // 调用OIDC服务器刷新令牌,获取新令牌集合
    var newTokens = await RefreshTokensAsync(authResult.Properties.GetTokenValue("refresh_token"));
    
    // 更新Properties中的令牌
    authResult.Properties.UpdateTokenValue("access_token", newTokens.AccessToken);
    authResult.Properties.UpdateTokenValue("id_token", newTokens.IdToken);
    if (!string.IsNullOrEmpty(newTokens.RefreshToken))
    {
        authResult.Properties.UpdateTokenValue("refresh_token", newTokens.RefreshToken);
    }
    
    // 重新登录,更新Cookie
    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, authResult.Principal, authResult.Properties);
}

刷新失败时

直接清除当前认证Cookie,并触发OIDC重新登录:

// 清除Cookie会话
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
// 触发OIDC认证挑战
await HttpContext.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:03:16