我有一个Cognito用户池,其MFA设置为Required
且仅TOTP
(即没有短信)。
我的问题是如何为用户重置MFA?例如,如果用户丢失了他的电话,那么他无论如何都无法登录。
我已尝试重置密码,但只重置密码,它不会删除MFA。
在AWS documentation的底部,它说
注意 API目前无法使用删除TOTP软件令牌操作。此功能计划在将来的版本中使用。使用SetUserMFAPreference禁用单个用户的TOTP MFA。
所以我尝试了SetUserMFAPreference
和AdminSetUserMFAPreference
,他们只返回200 OK,但实际上并没有禁用MFA。我想这是由于用户池的MFA设置为Required
。
答案 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)”的方法。