在AspNet MembershipProvider中更改密码问题

时间:2012-03-16 06:37:33

标签: c# asp.net-mvc-3 .net-4.0 asp.net-membership

我在MVC 3中使用AspNet Membership Provider。 我在更改密码时面临问题。 我的项目中有两个功能

  1. 忘记密码:询问安全问题并根据安全答案更改密码。
  2. 管理员更改密码:管理员可以在不知道旧密码或安全答案的情况下更改任何用户的密码。
  3. 现在的问题是,对于功能#1,我必须在web配置中进行更改,以便为更改密码设置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作为管理员部分,因此可能是另一个Web配置可以做一些魔术。

    请建议我如何在单个应用程序中同时具有这两个功能(重置密码和安全答案,没有安全答案)。

    非常感谢

1 个答案:

答案 0 :(得分:1)

终于得到了答案:                      在网络配置中,我设置了requiresQuestionAndAnswer="true",因此这解决了问题#1,现在忘记了密码,需要安全答案。

和问题#2,我希望admin的工具在不知道旧密码或安全答案的情况下更改任何用户的密码。我使用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

获得了此解决方案