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

使用Amazon Cognito C# SDK登出时无法失效IdToken的问题求助

Amazon Cognito SRP+MFA认证登出时IdToken未失效问题

我基于Amazon Cognito和C# SDK实现用户认证POC,采用带MFA挑战的SRP认证流程。目前已成功生成IdToken、AccessToken和RefreshToken,但登出时遇到问题:调用登出方法后,Cognito仍判定用户处于登录状态。调试发现AccessToken已失效,但IdToken未失效,请问如何确保登出时IdToken也被失效?

登录代码

public async Task<LoginUserResponse> LoginUser(LoginUserRequest loginUserRequest)
{
    var cognitoUser = await _userManager.FindByIdAsync(loginUserRequest.userName);
    if (cognitoUser == null)
    {
        throw new Exception("Not Found");
    }
    var authRequest = new InitiateSrpAuthRequest
    {
        Password = loginUserRequest.Password
    };
    var authResponse = await cognitoUser.StartWithSrpAuthAsync(authRequest);
    return new LoginUserResponse
    {
        SessionId = authResponse.SessionID,
    };
}

OTP验证代码

public async Task<ValidateLoginResponse> ValidateLogin(ValidateLoginRequest validateLoginUserRequest) 
{   
    AuthFlowResponse authResponse;

    var cognitoUser = await _userManager.FindByIdAsync(validateLoginUserRequest.userName);
    if (cognitoUser == null)
    {
        throw new Exception("Not Found");
    }
    var otp =  _distributedCache.Get(validateLoginUserRequest.userName).ToString();
    if (otp != null)
    {
        validateLoginUserRequest.Otp = otp;
    }

    var authRequest = new RespondToMfaRequest
    {
        SessionID = validateLoginUserRequest.SessionId,
        MfaCode = validateLoginUserRequest.Otp,
        ChallengeNameType = ChallengeNameType.SMS_MFA
    };

    try
    {
        authResponse = await cognitoUser.RespondToMfaAuthAsync(authRequest);
    }
    catch (Exception ex)
    {
        throw new Exception("Error Occur");
    }
    
    return new ValidateLoginResponse
    {
        AccessToken = authResponse.AuthenticationResult.AccessToken,
        IdToken = authResponse.AuthenticationResult.IdToken,
        RefreshToken = authResponse.AuthenticationResult.RefreshToken
    };
}

登出代码

public async Task Logout(string username)
{
    var cognitoUser = await _userManager.FindByIdAsync(username);
    if (cognitoUser == null)
    {
        throw new Exception("Not Found");
    }
    cognitoUser.SignOut();
}

解决方案

  • IdToken的本质特性:IdToken是无状态JWT,一旦签发会在有效期内(默认1小时)保持有效,Cognito没有直接强制失效已签发IdToken的机制,需通过以下方式实现登出后的有效管控:
  • 调用全局登出API:使用GlobalSignOutAsync方法,该操作会使该用户的所有RefreshToken失效,彻底阻断通过刷新令牌获取新IdToken/AccessToken的路径,同时配合本地会话清除:
    修改登出代码如下:
    public async Task Logout(string username)
    {
        var cognitoUser = await _userManager.FindByIdAsync(username);
        if (cognitoUser == null)
        {
            throw new Exception("Not Found");
        }
        // 全局登出,使所有RefreshToken失效
        await cognitoUser.GlobalSignOutAsync();
        // 清除本地客户端会话
        cognitoUser.SignOut();
    }
    
  • 后端令牌验证强化:在后端验证IdToken时,除了常规的签名、有效期校验,可调用Cognito的GetUserAsync接口或启用令牌 introspection 端点,确认用户当前会话状态(需注意控制调用频率,可结合缓存优化)。
  • 客户端强制清理:登出时必须立即清除客户端本地存储的IdToken、AccessToken和RefreshToken,避免客户端继续使用旧令牌发起请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 07:08:18