WinUI 3应用如何获取AccessToken/Session配置AWS Cognito MFA
解决方案
当SRP登录流程返回MFA_SETUP挑战时,认证流程尚未完成,此时不会返回正式的AccessToken,你不需要额外寻找AccessToken,直接使用当前挑战响应携带的临时Session字符串即可完成AssociateSoftwareToken接口的授权。
具体实现逻辑
- 在
authFlowResponse.ChallengeName == ChallengeNameType.MFA_SETUP分支中,直接读取authFlowResponse.Session属性值,该值是Cognito为当前未完成的认证流程颁发的临时授权凭证,完全满足MFA配置环节的接口鉴权要求 - 调用
AssociateSoftwareToken接口时,仅传入Session参数即可,禁止同时给AccessToken和Session赋值,两个参数同时传入会触发接口参数校验错误 - 拿到接口返回的TOTP密钥后,生成对应二维码或手动输入码提供给用户绑定身份验证器应用
- 用户绑定后输入验证码时,调用
VerifySoftwareToken接口同样传入该Session值+用户输入的6位验证码,验证通过后接口会返回正式的AccessToken、RefreshToken、IdToken,后续业务接口调用再使用该正式AccessToken即可
代码修改示例
登录逻辑调整
if (authFlowResponse.AuthenticationResult is null) { if (authFlowResponse.ChallengeName == ChallengeNameType.MFA_SETUP) { // 直接从挑战响应中取临时Session string mfaSetupSession = authFlowResponse.Session; // 传入Session调用MFA配置方法 var mfaSetupResult = await CognitoSetUpTOTPMFAAsync(sessionString: mfaSetupSession); } // 其余原有逻辑保持不变 }
MFA配置方法调整
try { AmazonCognitoIdentityProviderClient provider = new(new AnonymousAWSCredentials(), FallbackRegionFactory.GetRegionEndpoint()); AssociateSoftwareTokenRequest associateSoftwareTokenRequest = new() { // MFA设置挑战阶段仅传Session,不需要传AccessToken Session = sessionString }; AssociateSoftwareTokenResponse associateSoftwareTokenResponse = await provider.AssociateSoftwareTokenAsync(associateSoftwareTokenRequest); // 其余原有逻辑保持不变 return ... } catch (Exception) { return ... }
注意:只有当整个认证流程完全走完、拿到正式AccessToken后,后续用户重新绑定MFA等非挑战场景下的
AssociateSoftwareToken调用,才需要传入AccessToken作为授权凭证。
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

