时间:2017-03-16 01:06:54

标签: sql-server vb.net

我正在为我正在创建的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中输入的。

3 个答案:

答案 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指定的额外字符中分解出来的。虽然验证过程是在散列之前修剪额外字符以进行验证。由于它缺少额外的字符,因此散列不同并导致脚本掉到失败消息中。