2014-04-02 54 views
0

我想在嘗試重置密碼時更新單個用戶的密碼。手動密碼更新以明文形式存儲新密碼而不是哈希

而不是使用Membership.Provider.ResetPassword函數,我想要更多的控制正在生成的密碼。 生成的密碼只能包含大小寫字母和數字。

所以,我想:

的web.config

<providers> 
    <clear /> 
    <add name="MyMembershipProvider" 
     type="Sample.MyMembershipProvider" 
     connectionStringName="conn1" 
     requiresQuestionAndAnswer="false" 
     applicationName="/wedding" 
     minRequiredPasswordLength="6" 
     enablePasswordRetrieval="false" 
     enablePasswordReset="true" 
     requiresUniqueEmail="true" 
     minRequiredNonalphanumericCharacters="0" passwordFormat="Hashed" /> 
    </providers> 

resetpassword.aspx.vb

Dim newpassword As String = GlobalFunctions.CreateNewPassword(8)'this generated the password in the format I want 

Dim myConnection As SqlConnection = GetConnection() 

      Dim cmd As New SqlCommand("SELECT au.username, aa.ApplicationName, password, passwordformat, passwordsalt " & _ 
       "FROM aspnet_membership am " & _ 
       "INNER JOIN aspnet_users au " & _ 
       "ON (au.userid = am.userid) " & _ 
       "INNER JOIN aspnet_applications aa " & _ 
       "ON (au.applicationId = aa.applicationid) " & _ 
       "WHERE [email protected]", myConnection) 
      cmd.Parameters.Add(New SqlParameter("@email", Email)) 

然後用它來更新使用標準的ASP的密碼。 NET存儲過程:

除此之外,新密碼甚至沒有工作(可能是因爲我在我的membershiprovider中的密碼格式「哈希」在web.config中),密碼也以明文形式存儲,我不想。

那麼,如何更新用戶密碼並存儲密碼散列?

+1

爲什麼不直接用自己的實現覆蓋GeneratePassword而不是完全繞過Membership API? (即http://www.codeovereasy.com/2012/03/override-asp-net-membership-password-generation-rules/) –

回答

1

爲什麼你需要調用直接存儲過程? ASP.NET成員資格提供程序負責處理所有事情,並且只需使用asp.net提供程序的更新用戶方法來更新除密碼之外的所有內容。

請參閱以下鏈接中的ASP.NET和SQL Membership Provider中的所有可用方法。 http://msdn.microsoft.com/en-us/library/ff648345.aspx

你只需要使用下面的代碼來更新用戶信息的方法。並提供其他所需信息。

Membership.UpdateUser 

用於更新密碼方法。您可以使用更改密碼方法。

http://msdn.microsoft.com/en-us/library/system.web.security.sqlmembershipprovider.changepassword(v=vs.110).aspx

Membership.Provider.ChangePassword(User.Identity.Name, "OldPassword", "NewPassword"); 

眼下它的發生,因爲你是直接調用asp.net成員資格提供存儲過程,它會直接沒有對其加密更新密碼。

雖然內置的方法會加密它,然後它會存儲這個。

+0

啊,謝謝。但我仍然不確定如何獲取當前用戶和更新其密碼屬性,我現在有: Dim newpassword As String = GlobalFunctions.CreateNewPassword(8) Dim msp As New SqlMembershipProvider Dim myUser As MembershipUser = msp.FindUsersByEmail(電子郵件,0,1,0)(0) '我無法在下一行設置密碼屬性,該怎麼做? myUser.Password = newpassword 成員資格。UpdateUser(myUser) – Flo

+0

您可以使用任何內建的方法,如FindUsersByName或上面的msdn鏈接中的任何內容。然後,一旦你得到該用戶對象,然後只更新該對象的密碼屬性,並將其傳遞給UpdateUser。請不要忘記標記爲答案,如果它可以幫助您 –

+0

我相信這不起作用(請參閱http://msdn.microsoft.com/en-us/library/system.web.security.sqlmembershipprovider.updateuser(v= vs.110).aspx)特別是這一行「成員用戶的密碼不能使用UpdateUser方法更新」 –