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

