当IsApproved值为FALSE时,如何检查用户输入的密码是否与存储在数据库中的密码匹配?
我希望做的事情如下......
好的,上述所有情况都很好,我不会解决任何问题。
我遇到问题的地方是......
当用户尝试登录时,他/她的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
答案 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)
大家好,回答我的问题并感谢您的帮助, 在试图查看帐户成员资格是否已被批准之前,我试图验证密码似乎是在咆哮错误的树。
我确实以非常简单的方式解决了这个问题。 这就是我的方式,我不需要直接插入数据库密码字段,也不必担心散列密码。
首先我修改了默认的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)验证登录凭证