.NET环境下如何更新Cognito的Access/Id访问令牌
AWS Cognito 刷新令牌后替换过期令牌解决方案
1. 刷新接口返回空Session属于正常行为
REFRESH_TOKEN_AUTH 认证流本身不会返回Session参数,Session仅在认证需要额外挑战步骤(比如MFA验证、密码重置、自定义身份校验)时才会返回,刷新令牌成功的场景下无Session是预期结果,不需要额外处理。
你之前调用GetUserRequest没有效果是正常的,这个接口仅用于校验令牌有效性,不会主动更新当前用户会话存储的令牌信息。
2. 令牌替换核心实现
你拿到AdminInitiateAuthAsync的返回结果后,新的令牌全部存储在AuthenticationResult属性中,直接提取后替换原有存储的令牌即可,补全后的代码如下:
public async Task RefreshTokens(string refreshToken, string userId) { var request = new AdminInitiateAuthRequest { UserPoolId = userpool, ClientId = clientId, AuthFlow = AuthFlowType.REFRESH_TOKEN_AUTH, AuthParameters = { {"REFRESH_TOKEN", refreshToken}, {"SECRET_HASH", secret} } }; var response = await _cognitoIdentityProvider.AdminInitiateAuthAsync(request); // 提取新令牌信息 var authResult = response.AuthenticationResult; string newAccessToken = authResult.AccessToken; string newIdToken = authResult.IdToken; // 若用户池开启了刷新令牌轮换,此处会返回新的刷新令牌,否则沿用原有刷新令牌 string newRefreshToken = string.IsNullOrEmpty(authResult.RefreshToken) ? refreshToken : authResult.RefreshToken; DateTime tokenExpireTime = DateTime.UtcNow.AddSeconds(authResult.ExpiresIn); // 按你的存储逻辑替换旧令牌: // 场景1:服务端存储用户令牌(分布式缓存/数据库) await _userTokenStore.UpdateUserTokensAsync(userId, newAccessToken, newIdToken, newRefreshToken, tokenExpireTime); // 场景2:前后端分离架构,将新令牌返回给前端,前端替换本地存储(localStorage/sessionStorage/HttpOnly Cookie)中的旧令牌即可 // 示例返回值:return Ok(new { AccessToken = newAccessToken, IdToken = newIdToken, RefreshToken = newRefreshToken, ExpireAt = tokenExpireTime }); }
3. 特殊场景补充:ASP.NET Core 认证中间件会话更新
如果你使用的是ASP.NET Core自带的身份认证中间件,需要同步更新当前请求的用户身份信息,补充以下代码即可:
// 从新的IdToken解析用户身份声明 var jwtHandler = new JwtSecurityTokenHandler(); var idTokenObj = jwtHandler.ReadJwtToken(newIdToken); var newIdentity = new ClaimsIdentity(idTokenObj.Claims, "CognitoAuth"); var newPrincipal = new ClaimsPrincipal(newIdentity); // 替换当前HttpContext的用户身份 HttpContext.User = newPrincipal; // 重新签发认证Cookie(如果使用Cookie存储身份信息) await HttpContext.SignInAsync("Cookies", newPrincipal);
4. 注意事项
- 提前确认你的Cognito用户池是否开启了刷新令牌轮换功能,如果开启必须同步更新存储的刷新令牌,否则下次用旧的刷新令牌调用接口会直接报错。
- IdToken中存储了用户的身份声明信息,涉及到权限校验的场景要优先更新IdToken,避免权限校验不通过。
内容的提问来源于stack exchange,提问作者cheesus_maximus
相关产品推荐
相关产品推荐

