我想在单个用户尝试重置密码时更新密码。
我希望对正在生成的密码进行更多控制,而不是使用 Member.Provider.ResetPassword 函数。生成的密码只能包含大写和小写字母和数字。
所以我尝试了:
网络.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>
重置密码.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 中有密码格式"哈希"),密码也以明文形式存储,我不想要。
那么,如何更新用户的密码并存储散列的密码?
为什么需要调用直接存储过程? ASP.NET 成员资格提供程序负责所有事情,您只需要使用提供程序的更新用户方法来更新除密码之外的所有内容 asp.net。
在以下链接中查看 ASP.NET 和 SQL 成员资格提供程序中提供的所有方法。http://msdn.microsoft.com/en-us/library/ff648345.aspx
您只需使用以下代码来更新用户信息方法。 以及所需的其他信息。
Membership.UpdateUser
用于更新密码方法。您可以使用更改密码方法。
http://msdn.microsoft.com/en-us/library/system.web.security.sqlmemberprovider.changepassword(v=vs.110).aspx
Membership.Provider.ChangePassword(User.Identity.Name, "OldPassword", "NewPassword");
现在它发生了,因为你直接调用 asp.net 成员资格提供程序存储过程,因此它将直接更新密码而不加密密码。
而内置方法将对其进行加密,然后将其存储。