我正在为我正在创建的VB.net应用程序编写安全登录。正在通过SQL Server(2008 R2)上的存储过程处理登录验证。我需要程序来验证用户名和密码。然后回退登录消息(@responsemessage)和(@AccessLevel),以便我可以确定在我的VB脚本中打开哪个表单(管理员或用户)。
这是我到目前为止的程序
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @UUID INT
DECLARE @ResponseMessage NVARCHAR(250)
DECLARE @AccessLevel VARCHAR(1)
BEGIN
IF (SELECT UUID from logins where Username=@pUsername AND PassHash=HASHBYTES('MD5', @pPassword))
SET @UUID=(Select UUID FROM logins where Username=@pUsername AND PassHash=HASHBYTES('MD5', @pPassword))
SET @AccessLevel=(Select SecLevel FROM logins where Username=@pUsername AND PassHash=HASHBYTES('MD5', @pPassword))
SET @ResponseMessage=(SELECT statdesc from statuscodes where StatID='2')
End
ELSE
Begin
SET @ResponseMessage=(SELECT statdesc from statuscodes where StatID='3')
Select @ResponseMessage as 'Result', @AccessLevel as 'AccessLevel'
END 选择@ResponseMessage作为'Result',@ AccessLevel作为'AccessLevel' 结束
当我输入登录表中的用户名和密码时,我收到正确的登录消息,但我的AccessLevel列返回为NULL。这些变量是从我构建的VB.net winform中输入的。
答案 0 :(得分:2)
您的IF声明有两种错误:
首先你应该使用IF EXISTS,其次你没有将3个SET语句包装在BEGIN END块中。
这导致第一个SET没有被执行,因为IF不是True,并且第二个/第三个SET总是被执行,因为它们不受IF的控制。
您应该将SQL更改为
IF EXISTS (SELECT UUID from logins where Username=@pUsername AND PassHash=HASHBYTES('MD5', @pPassword)) BEGIN
SELECT @UUID= UUID, @AccessLevel= SecLevel FROM logins where Username=@pUsername AND PassHash=HASHBYTES('MD5', @pPassword)
SET @ResponseMessage=(SELECT statdesc from statuscodes where StatID='2')
End
您还可以将前两个SET组合成一个选择,因为它们的目标是数据库中的相同记录。
答案 1 :(得分:1)
试试这个。
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @UUID INT
DECLARE @ResponseMessage NVARCHAR(250)
DECLARE @AccessLevel VARCHAR(1)
IF EXISTS(SELECT UUID from logins where Username=@pUsername AND PassHash=HASHBYTES('MD5', @pPassword))
BEGIN
SET @UUID=(Select UUID FROM logins where Username=@pUsername AND PassHash=HASHBYTES('MD5', @pPassword))
SET @AccessLevel=(Select SecLevel FROM logins where Username=@pUsername AND PassHash=HASHBYTES('MD5', @pPassword))
SET @ResponseMessage=(SELECT statdesc from statuscodes where StatID='2')
END
ELSE
BEGIN
SET @ResponseMessage=(SELECT statdesc from statuscodes where StatID='3')
END
SELECT @ResponseMessage as 'Result', @AccessLevel as 'AccessLevel'
END
答案 2 :(得分:0)
感谢大家的所有回复。
虽然所有这些代码块都很有帮助。我找到了问题的根本原因。
我创建登录的存储过程是将@pPassword设置为CHAR(20)
我验证登录的存储过程是将@pPassword设置为VARCHAR(40)。
因此创建的哈希是从CHAR指定的额外字符中分解出来的。虽然验证过程是在散列之前修剪额外字符以进行验证。由于它缺少额外的字符,因此散列不同并导致脚本掉到失败消息中。