【发布时间】:2014-04-02 10:34:03
【问题描述】:
当单个用户尝试重置密码时,我想更新他的密码。
我不想使用 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 中的会员提供程序中有密码格式“哈希”)之外,密码还以明文形式存储,这是我不想要的。
那么,我怎样才能更新用户的密码并存储散列的密码呢?
【问题讨论】:
-
为什么不用你自己的实现覆盖 GeneratePassword 而不是完全绕过 Membership API? (即codeovereasy.com/2012/03/…)
标签: asp.net vb.net security hash passwords