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
相关产品推荐
相关产品推荐

