【问题标题】:Validate ASP.NET membership Username and Password when IsApproved is false当 IsApproved 为 false 时验证 ASP.NET 成员身份用户名和密码
【发布时间】:2012-12-17 01:08:13
【问题描述】:

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

我希望做的如下...

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

好的,以上所有的一切都很好,我不认为有任何问题。

我遇到的问题是……

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

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

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

【问题讨论】:

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


    【解决方案1】:

    更新并回答我的问题

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

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

    首先我修改了默认的 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
    

    这使我能够在帐户模型的 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
    

    现在修改的函数如下...

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

    【讨论】:

    • 这看起来仍然无法验证用户的凭据,除非 isApproved 字段设置为“true”。即使 isApproved 字段设置为“false”,您是否找到了验证凭据的方法?我和你的问题完全一样。
    【解决方案2】:

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

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

    编辑:

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

    【讨论】:

    • 是的,我相信密码是经过哈希处理的,所以这种方法可能行不通,但我稍后会试一试,看看它是否有效,如果有效,我会及时通知您。
    • 啊,哈希密码肯定会出现问题。我已经用另一个想法更新了答案。
    • Hiya Competent_tech,我上面的代码块可以评估 IsApproved 属性是真还是假,但它仍然不能说明如果密码输入错误,它仍然可以获得 IsApproved 的值但它不能解决密码和用户名是否正确但 isapproved 设置为 false 在这种情况下我想建议用户通过单击欢迎电子邮件中的链接来激活他们的个人资料的问题
    • 我认为您基本上有两个选择:1)您可以将 SqlMembership 提供程序拉入您的代码库,然后您就可以像这样进行任何您想要的更改(这就是我们所做的) 或 2) 修改获取用户存储过程始终返回 IsApproved = True,然后如果用户登录成功,则直接在代码中仔细检查。
    【解决方案3】:
    • 我认为一种方法是创建一个表来存储待批准的用户帐户。当用户注册时,使用 userID 或 userName 填充此表,或设置一些标志来指示尚未激活帐户和已发送邮件的用户。用户登录时查看此表,如果存在或未设置标志,则显示“Activate your account to user”

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

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

    【讨论】:

    • Hiya CodingBiz,根据我上面的代码示例,我已经可以获取数据库中保存的 ISAPPROVED 值,但我需要确认密码正确才能让用户激活他/她的密码....想法是...如果密码+用户名匹配文件+ IsApproved = False然后显示消息激活您的会员资格...其中...用户输入的密码不正确并且用户名是正确的,我仍然可以得到IsApproved 值...但如果密码不正确,则显示激活会员资料毫无意义!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2017-07-31
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多