AWS Cognito - 重置用户MFA

时间:2018-05-23 21:00:47

标签: amazon-web-services amazon-cognito cognito mfa

我有一个Cognito用户池,其MFA设置为Required且仅TOTP(即没有短信)。

我的问题是如何为用户重置MFA?例如,如果用户丢失了他的电话,那么他无论如何都无法登录。

我已尝试重置密码,但只重置密码,它不会删除MFA。

AWS documentation的底部,它说

  

注意 API目前无法使用删除TOTP软件令牌操作。此功能计划在将来的版本中使用。使用SetUserMFAPreference禁用单个用户的TOTP MFA。

所以我尝试了SetUserMFAPreferenceAdminSetUserMFAPreference,他们只返回200 OK,但实际上并没有禁用MFA。我想这是由于用户池的MFA设置为Required

5 个答案:

答案 0 :(得分:2)

在这一点上,由于AWS不支持重置MFA(如果您的用户池需要MFA-使用AdminSetUserMFAPreference禁用MFA将返回200 OK,但将不执行任何操作),唯一的方法是使用可选的MFA创建新的用户池(您必须创建一个新的用户池,因为一旦创建了用户池,就禁止从required更改为optional)。然后,使用新的用户池,您必须在代码内手动执行MFA(如果需要的话)。

为此,一旦用户成功登录并且返回对象中包含令牌,则必须调用AssociateSoftwareToken而不是返回令牌并开始MFA注册过程。令牌(如IdToken)仅在用户成功完成对AdminRespondToAuthChallenge的调用后才会返回给用户。

最底线,带有可选的MFA,AdminSetUserMFAPreference将起作用。这是在AWS上的用户池中重置MFA的唯一方法(此时)。

答案 1 :(得分:1)

实际上,您需要更改用户设置,而不是首选项。

删除MFA         var cognitoidentityserviceprovider =新的AWS.CognitoIdentityServiceProvider();

    var params = {
        UserPoolId: poolData.UserPoolId,
        Username: userid, /* required */
        MFAOptions: [ /* required */
        ]
    };
    cognitoidentityserviceprovider.adminSetUserSettings(params, function(err, data) {
        if (err) reject(err);       // an error occurred
        else     resolve(data);     // successful response
    });

要添加/更改MFA:

    var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider();

    var params = {
        UserPoolId: poolData.UserPoolId,
        Username: userid, /* required */
        MFAOptions: [ /* required */
            {
                AttributeName: 'phone_number',
                DeliveryMedium: 'SMS'
            }
        ]
    };
    cognitoidentityserviceprovider.adminSetUserSettings(params, function(err, data) {
        if (err) reject(err);       // an error occurred
        else     resolve(data);     // successful response
    });

答案 2 :(得分:0)

您可以为每个用户提供恢复代码,然后编写一个通过API端点公开的Lambda,以检查他们是否提交了正确的恢复代码。如果这样做,则可以在Lambda中调用以下命令以禁用用户的MFA:

  const result = await cognito
    .adminSetUserMFAPreference({
      UserPoolId: AmplifyConfig.Auth.userPoolId,
      Username: userid,
      SoftwareTokenMfaSettings: {
        Enabled: false,
        PreferredMfa: false,
      },
    })
    .promise();

在检查恢复代码时,请务必使用crypto.timingSafeEqual之类的东西来防御定时攻击。

答案 3 :(得分:0)

如果您是管理员,则可以使用以下AWS CLI命令对其进行更新:

aws cognito-idp admin-set-user-mfa-preference

有关更多信息,请查看the documentation

答案 4 :(得分:0)

我发现即使将用户添加到用户池后,也可以将 MFA 设置更改为“必需”。因此,您不必创建另一个用户池。

无法从控制台更改它,但是 aws cli(可能通过 set_user_pool_mfa_config() API)可以像这样更改它:

% aws cognito-idp set-user-pool-mfa-config --user-pool-id <userpool_id> --mfa-configuration ON --software-token-mfa-configuration Enabled=true

虽然我找不到删除/更改“每个用户的 MFA (OTP)”的方法。