2016-05-18 3 views
0

私はsqlを初めて使用しています。ストアドプロシージャに何が問題なのかよく分かりません。私の入力パラメータであり、それが正しいかどう国連が「正しくない国連復帰よりも、間違っている場合やPWは「誤ったPW」を返すよりも、間違っている場合は、その後、「ログイン成功」を返すストアドプロシージャでユーザーを認証

ユーザ入力ユーザー名&パスワード。ストアドプロシージャでは、私はIF Elseステートメントを持っており、それ以外のステートメントでは最初のIFステートメントには当てはまりません。

私のストアドプロシージャを見ていてください:上)

CREATE PROCEDURE [dbo].[AuthenticateUser] 
@UserName varchar(15), 
@Password varchar(15), 
@Role varchar(25) OUTPUT 
AS 
    SET NOCOUNT ON 
BEGIN 
    DECLARE @UN VARCHAR(25) 
    DECLARE @PW VARCHAR(25) 
    SELECT @UN = UserName, @PW = Password FROM LogIn 
     IF (@UN != @UserName COLLATE SQL_Latin1_General_CP1_CS_AS) 
      BEGIN 
       SET @Role = 'Incorrect User Name' 
      END 
     ELSE 
      BEGIN 
       IF (@PW != @Password COLLATE SQL_Latin1_General_CP1_CS_AS) 
        BEGIN 
         SET @Role = 'Incorrect Password' 
        END 
       ELSE 
        BEGIN 
         SET @Role = 'Logged in Successfully' 
        END 
      END 
    SELECT @Role 
END 

はあなたの助けのためにuserloginのFROM SELECT COUNT(1)へ

+0

だから、 'LogIn'テーブルからいくつかのランダムな行を選択し、渡された値と比較するのは正しいでしょうか? –

+0

コードは正常に動作します。パラメータを正しく渡してもよろしいですか? –

+0

こんにちはLashane、あなたの迅速な返信のおかげで、ありがとう私のコードはSqlCommand comm =新しいSqlCommand( "AuthenticateUser"、MyConnection.MyConn( "Open")); comm.CommandType = CommandType.StoredProcedure; comm.Parameters.Add( "@ UserName"、SqlDbType.VarChar).Value = userName.Text; comm.Parameters.Add( "@ Password"、SqlDbType.VarChar).Value = Password.Text; comm.Parameters.Add( "@ Role"、SqlDbType.VarChar、25); comm.Parameters ["@ Role"]。Direction = ParameterDirection.Output; comm.ExecuteNonQuery(); employee.UserRole =(comm.Parameters ["@ Role"]。Value).ToString(); – bigbapu

答えて

0

あなたはこれをやっている:

SELECT @UN = UserName, @PW = Password FROM LogIn 
    IF (@UN != @UserName COLLATE SQL_Latin1_General_CP1_CS_AS) 

これらcomparisions @UN = UserName@PW = Password行の適切なフィルタリングに役立つようにWHERE句でなされるべきです。ここで

は、コード書き換え(あなたがあなた自身のテーブル名を使用して変更することができます)

Drop Table TestLogin 
GO 
Create Table TestLogin 
(
UserName VarChar (20), 
Password VarChar(20) 
) 
Insert TestLogin Values ('One', 'Two') 
GO 




Drop PROCEDURE AuthenticateUser 
GO 
CREATE PROCEDURE AuthenticateUser 
    @UserName varchar(15), 
    @Password varchar(15), 
    @Role varchar(25) OUTPUT 
AS 

    If ((SELECT Count (*) From TestLogin Where UserName COLLATE SQL_Latin1_General_CP1_CS_AS = @Username And Password COLLATE SQL_Latin1_General_CP1_CS_AS = @Password) = 0) 
    Begin 
     If ((SELECT Count (*) From TestLogin Where UserName COLLATE SQL_Latin1_General_CP1_CS_AS = @Username) = 0) 
     Begin 
      Select @Role = 'Incorrect User Name' 
     End 
     Else 
     Begin 
      Select @Role = 'Incorrect Password' 
     End 
    End 
    Else 
    Begin 
     Select @Role = 'Logged in Successfully' 
    End 
GO 
Declare @Role VarChar (100) 
Exec AuthenticateUser 'One', 'Two', @Role Output 
Print @Role 

Exec AuthenticateUser 'One', 'TwoX', @Role Output 
Print @Role 

Exec AuthenticateUser 'OneX', 'Two', @Role Output 
Print @Role 

端に設けられた三つの例は、あなたがそれを良いログインを与える際の手順がどのように動作するかをお見せ、どちらかでありますパラメータが正しくありません。

+0

こんにちはRajさん、あなたのスーパーヘルプのおかげでうまくいきました。 – bigbapu

0

変更していただきありがとうございます....してからは、ExecuteScalarを(使用しますSqlDataReaderオブジェクト。

パスワードを平文でDBに保存するのは良い考えではありませんが、代わりに、好ましくは塩分値でハッシュしてください。

+0

このコードのスカラー部分に問題はありません。パスワードの実際の検証にあります。 –

0

代わりにこれを試してみてください:

Create PROCEDURE [dbo].[AuthenticateUser] 
@UserName varchar(15), 
@Password varchar(15), 
@Role varchar(25) OUTPUT 
AS 
    SET NOCOUNT ON 
BEGIN 

    If Not Exists (Select 1 From LogIn Where UserName = @UserName) Set @Role = 'Incorrect UserName' 
    Else If Not Exists (Select 1 From LogIn Where Password = @Password) Set @Role = 'Incorrect Password' 
    Else Set @Role = 'Logged in Successfully' 

    Select @Role 

END 
0

は一般的に、攻撃者に手がかりを与えることは良い考えではありません「名前がOKで、今PWDを推測します」。さらに、パスワードは少なくとも大文字と小文字を区別する必要があります。この目的のために:

select @un=username from LogIn 
where [email protected] 

if @un is null 
    set @role = 'UN not found' 
else 
begin 
    select @un=username from LogIn 
    where [email protected] 
    and cast(password as varbinary(max)) = cast(@password as varbinary(max)) 
    if @un is null 
     set @role = 'password incorrect' 
    else 
     set @role = 'Success' 
end 

P.S:私は、ユーザー名は、テーブル内で一意であることを望む:

select @un=username from LogIn 
where [email protected] 
and cast(password as varbinary(max)) = cast(@password as varbinary(max)) 

if @un is null 
    set @role = 'UN or PWD is incorrect' 
else 
    set @role = 'Success' 

あなたがヒントを与えたい場合は