3

当 IsApproved 值为 FALSE 时,如何检查用户输入的密码是否与数据库中存储的密码匹配?

我希望做的是如下...

  1. 用户注册 - 详细信息已保存且 IsApproved 设置为 false
  2. 用户收到带有会员确认链接的欢迎电子邮件
  3. 用户单击电子邮件中的链接 - 此时 IsApproved 设置为 True
  4. 用户现在可以登录

好的,以上所有内容都很好,我没有发现任何问题。

我遇到问题的地方是...

当用户尝试登录并且他/她的 IsApproved 标志为 FALSE 时,我需要将他/她的密码与存储在 DB 中的密码进行交叉引用,这就是我卡住的地方。

这个想法是交叉检查密码,如果用户输入了有效的凭据,那么通过点击电子邮件等等来向用户显示一条消息,说激活你的会员资格。

但即使输入的密码匹配,因为我无法在代码中检查它,ValidateUser 函数总是返回 false,因为 IsApproved 设置为 false!

谁能指出我正确的方向?

另外我实际上不需要查看密码,所以即使有一个密封的函数,我也可以调用它来简单地确认密码是否匹配也很好......

下面是我的代码块..

        Public Function ValidateUser(ByVal Username As String, ByVal Password As String, ByRef PwdMatches As Boolean, ByRef Approved As Boolean) As Boolean Implements IMembershipService.ValidateUser
    '
    Dim ThisMember As MembershipUser = Nothing
    Dim ThisResult As Boolean = Nothing
        '
        Approved = False
        ThisResult = False
        PwdMatches = False
        If String.IsNullOrEmpty(Username) Then
            Throw New ArgumentException("Value cannot be null or empty.", "Username")
        ElseIf String.IsNullOrEmpty(Password) Then
            Throw New ArgumentException("Value cannot be null or empty.", "Password")
        ElseIf _Provider.ValidateUser(Username, Password) Then
            ThisResult = True
        Else
            Try
                ThisMember = _Provider.GetUser(Username, False)
                Try
                    If (ThisMember Is Nothing) = False Then
                        Approved = ThisMember.IsApproved
                        Try
                          <!-- This is the point im stuck on -->
                            If Password_Matches_With_Password_In_Db Then
                                PwdMatches = True
                            Else
                                PwdMatches = False
                            End If
                        Catch ex As Exception
                            ThisResult = False
                        End Try
                    Else
                        ThisResult = False
                    End If
                Catch ex As Exception
                    ThisResult = False
                End Try
            Catch ex As Exception
                ThisResult = False
            End Try
        End If
        Return ThisResult
        ThisMember = Nothing
        ThisResult = Nothing
    End Function
4

3 回答 3

0
  • 我认为一种方法是创建一个表来存储待批准的用户帐户。当用户注册时,使用 userID 或 userName 填充此表,或设置一些标志来指示尚未激活帐户和已发送邮件的用户。用户登录时检查此表,如果存在或未设置标志,则显示“将您的帐户激活给用户”

  • 编写一个连接数据库的函数,并使用 userId 从Aspnet_Membership表中获取批准状态。列名IsApproved是真还是假

    Dim user As MembershipUser = Membership.GetUser(userName); Dim isApproved As Boolean = myMethodCheckIfUserIsApproved(user.ProviderUserKey); //userID

于 2013-01-02T17:51:29.483 回答
0

您应该能够调用该方法,作为参数Membership GetPassword传入,这应该只会导致返回密码。NothingpasswordAnswer

但是,关于这种方法的免责声明:我们已经实现了自己的成员资格提供程序和 SQL,并且我没有原始代码来验证这一点,因此默认提供程序中可能有一些东西会阻止这种方法,但它是值得尝试。

编辑:

在密码被散列的情况下,一个可能的解决方案是对用户表执行直接数据库查询以获取 IsApproved 标志的状态。您可以在调用 GetUser 之前或之后执行此操作,具体取决于您对最终用户的信任程度(如果您不信任他们,我会在之后调用它以防止有人尝试多个用户查看哪些是活动的)。

于 2013-01-02T17:42:49.423 回答
0

更新并回答我的问题

大家好,回答我的问题并感谢您的帮助,在尝试查看帐户成员资格是否已获得批准之前,我试图验证密码似乎是在吠叫错误的树。

我确实以非常简单的方式解决了这个问题。我就是这样做的,我不需要直接询问数据库密码字段,也不必担心对密码进行哈希处理。

首先,我在 ACCOUNTS MODEL 的 SERVICES 区域中修改了默认的 VALIDATELUSER 调用声明......

Function ValidateUser(ByVal Username As String, ByVal Password As String) As Boolean

至...

Function ValidateUser(ByVal Username As String, ByVal Password As String, ByRef IsApproved As Boolean) As Boolean

这使我能够在帐户模型的服务区域中调用我新修改的验证过程,其中原始代码如下......

Public Function ValidateUser(ByVal userName As String, ByVal password As String) As Boolean Implements IMembershipService.ValidateUser
  If String.IsNullOrEmpty(userName) Then Throw New ArgumentException("Value cannot be null or empty.", "userName")
  If String.IsNullOrEmpty(password) Then Throw New ArgumentException("Value cannot be null or empty.", "password")
  Return _provider.ValidateUser(userName, password)
End Function

现在修改的功能如下......

Public Function ValidateUser(ByVal Username As String, ByVal Password As String, ByRef Approved As Boolean) As Boolean Implements IMembershipService.ValidateUser
  Dim ThisMember As MembershipUser = Nothing
  Dim ThisResult As Boolean = Nothing
  '
    Approved = False
    ThisResult = False
    If String.IsNullOrEmpty(Username) Then
      Throw New ArgumentException("Value cannot be null or empty.", "Username")
    ElseIf String.IsNullOrEmpty(Password) Then
      Throw New ArgumentException("Value cannot be null or empty.", "Password")
    ElseIf _Provider.ValidateUser(Username, Password) Then
      ThisResult = True
    Else
      ThisMember = _Provider.GetUser(Username, False)
      If (ThisMember Is Nothing) = False Then
        Approved = ThisMember.IsApproved
      End If
    End If
    Return ThisResult
    ThisMember = Nothing
    ThisResult = Nothing
  End Function

与直接操作数据库和散列密码相比,我对这个过程更满意。

所以实际上,它更多的是关于原始的处理顺序是从后到前...... IE。不是 (1) 验证登录凭据然后 (2) 检查电子邮件是否已确认?(通过欢迎消息中的链接)而是...(1)电子邮件确认然后(2)验证登录凭据

于 2013-01-05T03:49:04.830 回答