Изменить пароль в AspNet MembershipProvider - PullRequest
2 голосов
/ 16 марта 2012

Я использую AspNet Membership Provider в MVC 3. У меня проблема с изменением пароля.У меня есть две функции в моем проекте

  1. Забыл пароль: задайте секретный вопрос и на основании безопасного ответа смените пароль.
  2. Администратор сменить пароль: администратор может сменить пароль любого пользователя, не знаястарый пароль или секретный ответ.

Теперь проблема в том, что для функциональности # 1 мне нужно внести изменения в веб-конфигурацию для внесения requiresQuestionAndAnswer="true" для смены пароля, чтобы я мог сменить пароль, только если безопасностьответ действителен.

<membership>
      <providers>
        <clear />
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
      </providers>
    </membership>

и я использую приведенный ниже код для смены пароля в забытом пароле:

   string resetPassword = res.ResetPassword(model.PasswordAnswer);
   MembershipService.ChangePassword(model.Username, newPassword, model.NewPassword)

теперь для ситуации # 2, где для администратора я хочу, чтобы средство сменило парольлюбого пользователя, не зная старого пароля или секретного ответа.что возможно (насколько я знаю), только сделав requiresQuestionAndAnswer="false".

Примечание: я использую отдельную MVC AREA для административной части, поэтому может быть другая веб-конфигурация может творить чудеса.

подскажите, пожалуйста, как можно объединить обе функции (сброс пароля с защитным ответом и без защитного ответа) в одном приложении.

Большое спасибо

1 Ответ

1 голос
/ 19 марта 2012

Наконец-то получил ответ: в веб-конфигурации я установил requiresQuestionAndAnswer="true", поэтому это решает проблему № 1, теперь для забытого пароля требуется защитный ответ.

и для проблемы № 2, где я хочувозможность для администратора изменить пароль любого пользователя, не зная старого пароля или секретного ответа.Я использовал Reflection для того, чтобы изменить значение закрытой переменной _ RequiresQuestionAndAnswer на false, затем сбросить пароль и затем снова установить его значение на true:

var _requiresQA = Membership.Provider.GetType().GetField("_RequiresQuestionAndAnswer",
        System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    //change the value in the private field
    _requiresQA.SetValue(Membership.Provider, false);
    //do the reset
    tempPassword = user.ResetPassword();
    //set it's original value
    _requiresQA.SetValue(Membership.Provider, true);

Я получил это решение по адресу: http://djsolid.net/blog/asp.net-membership---change-password-without-asking-the-old-with-question-and-answer

...