我在MVC 3中使用AspNet Membership Provider。 我在更改密码时面临问题。 我的项目中有两个功能
现在的问题是,对于功能#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配置可以做一些魔术。
请建议我如何在单个应用程序中同时具有这两个功能(重置密码和安全答案,没有安全答案)。
非常感谢
答案 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);
获得了此解决方案