【问题标题】:Manual Password Update Stores the New Password in Clear Text Instead of Hashed手动密码更新以明文而不是散列存储新密码
【发布时间】: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 中的会员提供程序中有密码格式“哈希”)之外,密码还以明文形式存储,这是我不想要的。

那么,我怎样才能更新用户的密码并存储散列的密码呢?

【问题讨论】:

标签: asp.net vb.net security hash passwords


【解决方案1】:

为什么需要调用直接存储过程? ASP.NET Membership 提供程序会处理所有事情,您只需使用 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.sqlmembershipprovider.changepassword(v=vs.110).aspx

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

现在它正在发生,因为您直接调用 asp.net 成员资格提供程序存储过程,因此它将直接更新密码而不加密它。

虽然内置方法会对其进行加密,然后将其存储。

【讨论】:

  • 啊,谢谢。但我仍然不确定如何获取当前用户并更新其密码属性,我现在有: Dim newpassword As String = GlobalFunctions.CreateNewPassword(8) Dim msp As New SqlMembershipProvider Dim myUser As MembershipUser = msp.FindUsersByEmail(Email, 0 , 1, 0)(0) '我不能在下一行设置密码属性,怎么办? myUser.Password = newpassword Membership.UpdateUser(myUser)
  • 您可以使用任何内置方法,例如 FindUsersByName 或上面 msdn 链接中的任何方法。然后,一旦您获得该用户对象,则只需更新该对象的密码属性并将其传递给 UpdateUser。如果对您有帮助,请不要忘记将其标记为答案
  • 我相信这行不通(请参阅msdn.microsoft.com/en-us/library/…),特别是这一行“会员用户的密码无法使用 UpdateUser 方法更新”
  • 使用msdn.microsoft.com/en-us/library/…修改密码方法。
  • 另外,你为我的答案投票是非常粗鲁的,因为我所做的只是想帮助你
猜你喜欢
  • 2014-03-05
  • 2020-12-20
  • 2019-02-11
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
相关资源
最近更新 更多