提问者:小点点

AWSCognito-重置用户MFA


我有一个Cognito用户池,它MFA设置为必需的,只有TOTP(即没有SMS)。

我的问题是如何重置用户的MFA?例如,如果用户丢失了他的手机,所以他不必登录。

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

AWS留档的底部写着

注意:删除TOTP软件令牌操作目前在API中不可用。此功能计划在未来版本中使用。使用SetUserMFAPresettings禁用单个用户的TOTPMFA。

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


共3个答案

匿名用户

此时,由于AWS不支持重置MFA(如果您的用户池需要MFA-禁用MFA使用AdminSetUserMFAPresettings将返回200 OK,但它什么也不会做),因此唯一的方法是创建一个具有可选MFA的新用户池(您必须创建一个新的用户池,因为一旦创建了用户池,就禁止从必需更改为可选)。然后,对于新用户池,您必须在代码中手动强制MFA(如果您想要的话)。

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

总之,使用可选的MFA,AdminSetUserMFAPre的将工作。这是在AWS上重置用户池中MFA的唯一方法。

[更新]

并不是说我最初的答案是无效的,只是为了提供更多信息,这里有一些关于如何使用AdminSetUserMFAPre的额外解释

首先,您需要一个具有可选MFA的用户池。可选是这里的关键字。此解决方案不适用于具有所需MFA的用户池。

设置用户池后,我假设有一个用户正确注册了您的用户池。这意味着他们可以根据您的用户池进行身份验证,没有任何问题。当然,关键是他们需要提供MFA作为身份验证过程的一部分。但是由于我们已经建立了,MFA在您的用户池中是可选的,所以如果您坚持对用户强制MFA,这意味着您必须在代码中手动执行。

好吧,到目前为止,每个人都很开心。但现实是,悲伤的日子来了。你的用户丢失了他们的MFA代码,无法生成任何新的代码。所以你想通过重新注册一个新设备来为他们提供重置MFA的可能性。当然,首先,你需要确保是真正的用户请求这样的东西。我的意思是,你不希望任何人(除了真正的用户)能够发出这样的请求。所以你需要先对他们进行身份验证。但是他们无法验证(由于缺少MFA)的事实是他们最终来到这里的全部原因。那么你现在能做什么呢?好吧,尽管这部分不在本文的范围内,但作为一个小提示,您可以向他们发送一封带有代码的电子邮件,并要求他们将其作为一次性身份验证机制返回给您。

好的,回到手头的问题。现在,您确定是实际的帐户所有者请求MFA重置。这是您的操作方式:

async function resetMfa(username) {
    const cognito = new AWS.CognitoIdentityServiceProvider();
    await cognito.adminSetUserMFAPreference({
            UserPoolId: "user pool ID",
            Username: username,
            SoftwareTokenMfaSettings: {
                Enabled: false,
            }
        }).promise();
}

一旦他们的MFA被禁用,为了重新注册一个新设备,帐户所有者必须尝试一个新的登录。这种尝试将就像他们第一次登录他们的帐户一样,他们将被要求注册一个新的MFA设备。

我希望这能澄清一些事情。如果你想知道如何使用MFA(手动),我有另一篇文章来解决这个问题。

匿名用户

我发现即使用户被添加到用户池中,也可以将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)”的方法。

匿名用户

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

删除MFAvar CognitoIdtyServiceProvider=new AWS. CognitoIdtyServiceProvider();

    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
    });