当一个用户试图重置他的密码时,我想更新他的密码。
与其使用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 am.email=@email", myConnection)
cmd.Parameters.Add(New SqlParameter("@email", Email))然后使用它来使用标准的ASP.NET存储过程更新密码:
Public Shared Function SetMemberPassword(ByVal ApplicationName As String, ByVal UserName As String, _
ByVal NewPassword As String, ByVal PasswordSalt As String, ByVal CurrentTimeUtc As DateTime, _
ByVal PasswordFormat As Integer) As Boolean
Dim result As Boolean
Dim myConnection As SqlConnection = GetConnection()
Dim cmd As New SqlCommand("aspnet_Membership_SetPassword", myConnection)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add(New SqlParameter("@ApplicationName", ApplicationName))
cmd.Parameters.Add(New SqlParameter("@UserName", UserName))
cmd.Parameters.Add(New SqlParameter("@NewPassword", NewPassword))
cmd.Parameters.Add(New SqlParameter("@PasswordSalt", PasswordSalt))
cmd.Parameters.Add(New SqlParameter("@CurrentTimeUtc", CurrentTimeUtc))
cmd.Parameters.Add(New SqlParameter("@PasswordFormat", PasswordFormat))
Try
myConnection.Open()
result = CBool(cmd.ExecuteScalar)
Catch ex As Exception
Finally
myConnection.Close()
End Try
Return result
End Function此外,新密码甚至不起作用(可能是因为我在web.config中的membershiprovider中有密码格式“that”),密码也存储在明文中,这是我不想要的。
那么,我如何更新用户的密码并存储密码哈希呢?
发布于 2014-04-02 10:47:48
为什么需要调用直接存储过程?ASP.NET成员资格提供程序负责所有事务,您只需使用asp.net提供程序的update用户方法来更新除密码之外的所有内容。
在下面的链接中,请参阅ASP.NET和SQL成员资格提供程序中可用的所有方法。http://msdn.microsoft.com/en-us/library/ff648345.aspx
您只需要使用下面的代码来更新用户信息方法。还有其他需要的信息。
Membership.UpdateUser用于更新密码方法。您可以使用更改密码方法。
Membership.Provider.ChangePassword(User.Identity.Name, "OldPassword", "NewPassword");现在发生这种情况是因为您直接调用asp.net成员资格提供程序存储过程,因此它将直接更新密码而不对其进行加密。
而内置的方法将对其进行加密,然后将其存储起来。
https://stackoverflow.com/questions/22808697
复制相似问题