首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >手动密码更新以明文存储新密码,而不是哈希

问手动密码更新以明文存储新密码,而不是哈希
EN

Stack Overflow用户
提问于 2014-04-02 10:34:03
回答 1查看 243关注 0票数 0

当一个用户试图重置他的密码时,我想更新他的密码。

与其使用Membership.Provider.ResetPassword函数,我希望对生成的密码有更多的控制。生成的密码只能包含大小写字母和数字。

所以我试着:

web.config

代码语言:javascript
复制
  <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

代码语言:javascript
复制
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存储过程更新密码:

代码语言:javascript
复制
    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”),密码也存储在明文中,这是我不想要的。

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

EN

回答 1

Stack Overflow用户

发布于 2014-04-02 10:47:48

为什么需要调用直接存储过程?ASP.NET成员资格提供程序负责所有事务,您只需使用asp.net提供程序的update用户方法来更新除密码之外的所有内容。

在下面的链接中,请参阅ASP.NET和SQL成员资格提供程序中可用的所有方法。http://msdn.microsoft.com/en-us/library/ff648345.aspx

您只需要使用下面的代码来更新用户信息方法。还有其他需要的信息。

代码语言:javascript
复制
Membership.UpdateUser

用于更新密码方法。您可以使用更改密码方法。

http://msdn.microsoft.com/en-us/library/system.web.security.sqlmembershipprovider.changepassword(v=vs.110).aspx

代码语言:javascript
复制
Membership.Provider.ChangePassword(User.Identity.Name, "OldPassword", "NewPassword");

现在发生这种情况是因为您直接调用asp.net成员资格提供程序存储过程,因此它将直接更新密码而不对其进行加密。

而内置的方法将对其进行加密,然后将其存储起来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22808697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档