IsApproved为false时,验证ASP.NET成员身份用户名和密码

时间:2013-01-02 16:53:06

标签: asp.net vb.net validation asp.net-mvc-2 membership-provider

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

我希望做的事情如下......

  1. 用户注册 - 保存的详细信息和IsApproved设置为false
  2. 用户收到带有会员资格认证链接的欢迎电子邮件
  3. 用户点击电子邮件中的链接 - 此时IsApproved设置为True
  4. 用户现在可以登录
  5. 好的,上述所有情况都很好,我不会解决任何问题。

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

    当用户尝试登录时,他/她的IsApproved标志为FALSE 我需要交叉引用他/她的密码与存储在DB中的密码 那就是我被困住的地方。

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

    但即使输入的密码匹配,因为我无法在代码中检查它,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
    

3 个答案:

答案 0 :(得分:0)

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

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

编辑:

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

更新&amp;回答我的问题

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

我确实以非常简单的方式解决了这个问题。 这就是我的方式,我不需要直接插入数据库密码字段,也不必担心散列密码。

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

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

这使我能够在Accounts模型的SERVICES区域中调用我新修改的验证过程,其中ORGINIAL CODE如下所示......

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

现在的MODIFIED函数如下......

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)验证登录凭证