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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:54:01