2012-03-16 36 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