Cognito .Net C # Принудительный сброс пароля входит в порочный круг - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь интегрировать AWS Cognito в веб-сайт.Я пытаюсь заставить пользователя изменить свой пароль.У меня уже был метод для добровольного сброса пароля, и я пытался использовать его для принудительного сброса пароля.Вот метод:

internal async Task<bool> ResetPassword(string username, string oldPassword, string newPassword) {
    AmazonCognitoIdentityProviderClient provider = new AmazonCognitoIdentityProviderClient(new Amazon.Runtime.AnonymousAWSCredentials());
    CognitoUserPool userPool = new CognitoUserPool(CognitoHelper.POOL_ID, CognitoHelper.CLIENTAPP_ID, provider);
    CognitoUser user = new CognitoUser(username, CognitoHelper.CLIENTAPP_ID, userPool, provider);
    InitiateSrpAuthRequest authRequest = new InitiateSrpAuthRequest() {
        Password = oldPassword
    };

    AuthFlowResponse authResponse = await user.StartWithSrpAuthAsync(authRequest).ConfigureAwait(false);
    await user.ChangePasswordAsync(oldPassword, newPassword);

    return true;
} // ResetPassword

Когда я вызываю этот метод при добровольном сбросе пароля, он работает нормально.При принудительном сбросе пароля «StartWithSrpAuthAsync» выдает исключение, сообщающее «Требуется сброс пароля для пользователя».Без шуток - вот почему я пытаюсь сменить пароль.

Проблема в том, что метод ChangePasswordAsync требует, чтобы пользователь прошел аутентификацию до его вызова.Я не могу аутентифицировать пользователя, потому что пароль должен быть сброшен, но я не могу изменить пароль, потому что пользователь должен сначала пройти аутентификацию.

Я попытался взломать, чтобы решить мою проблему, поймав "Сброс пароля требуется для пользователя "исключение, надеясь, что пользователь все равно был аутентифицирован.К сожалению, не повезло:

internal async Task<bool> ResetPassword(string username, string oldPassword, string newPassword) {
    AmazonCognitoIdentityProviderClient provider = new AmazonCognitoIdentityProviderClient(new Amazon.Runtime.AnonymousAWSCredentials());
    CognitoUserPool userPool = new CognitoUserPool(CognitoHelper.POOL_ID, CognitoHelper.CLIENTAPP_ID, provider);
    CognitoUser user = new CognitoUser(username, CognitoHelper.CLIENTAPP_ID, userPool, provider);
    InitiateSrpAuthRequest authRequest = new InitiateSrpAuthRequest() {
        Password = oldPassword
    };

    try {
        AuthFlowResponse authResponse = await user.StartWithSrpAuthAsync(authRequest).ConfigureAwait(false);
        await user.ChangePasswordAsync(oldPassword, newPassword);
    } catch (Exception exp) {
        if (exp.Message == "Password reset required for the user") {
            await user.ChangePasswordAsync(oldPassword, newPassword);
        } else {
            throw exp;
        } // if else
    } // try catch
    return true;
} // ResetPassword

Есть мысли?

1 Ответ

0 голосов
/ 02 апреля 2019

Я пытался рассматривать принудительный сброс как случай забытого пароля, и это сработало! В частности, чтобы отправить новый код подтверждения на электронную почту пользователя:

    internal async Task<ForgotPasswordResponse> ForgotPassword(string username) {
        ForgotPasswordRequest forgotPasswordRequest = new ForgotPasswordRequest();
        forgotPasswordRequest.Username = username;
        forgotPasswordRequest.ClientId = CLIENTAPP_ID;

        ForgotPasswordResponse forgotPasswordResponse = await provider.ForgotPasswordAsync(forgotPasswordRequest).ConfigureAwait(false);
        return forgotPasswordResponse;
    } // ForgotPassword

и

    internal async Task<ConfirmForgotPasswordResponse> ConfirmForgotPassword(string validationCode, string username, string newPassword) {
        ConfirmForgotPasswordRequest confirmForgotPasswordRequest = new ConfirmForgotPasswordRequest();
        confirmForgotPasswordRequest.Username = username;
        confirmForgotPasswordRequest.ClientId = CLIENTAPP_ID;
        confirmForgotPasswordRequest.Password = newPassword;
        confirmForgotPasswordRequest.ConfirmationCode = validationCode;

        ConfirmForgotPasswordResponse confirmForgotPasswordResponse = await provider.ConfirmForgotPasswordAsync(confirmForgotPasswordRequest).ConfigureAwait(false);
        return confirmForgotPasswordResponse;
    } // ConfirmForgotPassword

для «сброса» нового пароля. Из того, что я вижу в документации, это нигде не прописано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...