2012-03-16 62 views
2

我在MVC 3中使用AspNet成员资格提供程序。 我在更改密码时遇到问题。 我有两个功能在我的项目更改AspNet中的密码问题MembershipProvider

  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,所以可能是另一个web配置可以做一些魔术。

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

非常感谢

回答

1

终于得到了答案: 在Web配置我设置requiresQuestionAndAnswer="true"所以这样可以解决问题#1,现在忘记密码,需要一个安全的答案。

和问题#2,我希望管理员可以在不知道旧密码或安全答案的情况下更改任何用户的密码。我已经使用反射它改变私有变量的值_ 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