手动密码更新以明文而非哈希的方式存储新密码

时间:2014-04-02 10:34:03

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

我想在尝试重置密码时更新单个用户的密码。

我希望对正在生成的密码有更多控制权,而不是使用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

除了新密码甚至不起作用(可能是因为我有密码格式&#34; Hashed&#34;在我的web.config中的membersrovider中),密码也以明文形式存储,我不知道&#39 ;想要。

那么,如何更新用户密码并存储密码哈希?

1 个答案:

答案 0 :(得分:1)

为什么需要调用直接存储过程? 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.sqlmembershipprovider.changepassword(v=vs.110).aspx

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

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

虽然内置方法会加密它,然后它会存储它。