2014-03-19 60 views
0

我已經爲SQL中的用戶身份驗證編寫了一個存儲過程,我應該如何從此過程的後面的c#.Net代碼中獲取返回值以使用戶能夠登錄?使用存儲過程進行身份驗證

create procedure userLogin_proc 
@userName nvarchar(45), 
@passCode nvarchar(20) 

as 
begin 

select userName,passCode from userLogin where username = @userName and passCode = @passCode 
end 
+1

你如何在你的服務器端代碼中訪問你的數據庫?你在使用ADO.NET嗎?你是否像使用實體框架一樣使用ORM? – Christos

+4

如果這是一個生產環境,則不應在明碼中存儲密碼。散列密碼,存儲散列,並將用戶輸入密碼的散列與存儲的散列進行比較。也考慮使用鹽。 –

回答

3

使用輸出參數返回用戶ID,如果登錄成功,用戶ID將被退回,否則將返回0

create procedure userLogin_proc 
@userName nvarchar(45), 
@passCode nvarchar(20) 
@UserId int=0 OUTPUT 
as 
begin 

select @UserId =id from userLogin where username = @userName and passCode = @passCode 
end 

,並在C#方這樣做的ExecuteReader後:

SqlDataReader reader=cmd.ExecuteReader(); 
int UserId = (int)cmd.Parameters["@UserId"].Value; 

你可以在這裏閱讀更多關於輸出參數的信息:

http://www.codeproject.com/Questions/136351/How-to-retrieve-output-parameter-from-Store-proced

+0

你能在你的代碼中解釋'OUTPUT'單詞的用法? – Iatrochemist

+1

它是關鍵字,當我們寫我們的意思是說,這個參數將在執行後由存儲過程輸出返回 –

+1

你可以在網上閱讀更多有關輸出參數,並可以在這裏看到例子lkie:http://www.codeproject.com/問題/ 136351 /如何對檢索輸出參數 - 從商店,proced –

1

將其更改爲SELECT COUNT(1) FROM userLogin....然後SqlDataReader對象上使用ExecuteScalar()

請注意,將密碼以純文本形式存儲在數據庫中並不是一個好主意,但應該使用明文形式將其密碼散列,最好使用鹽值。

+0

你可以給一個如何散列密碼的例子嗎?@Wim – Iatrochemist

+1

有很多這樣的例子已經在這裏,請參閱http://stackoverflow.com/search?q=hash+password+c%23 –

1

不要將純文本密碼存儲在數據庫中。查找哈希方法。在我的例子中,我使用SHA256

class User 
{ 
    public string UserName { get; private set; } 
    public string Password { get; private set; } 
    public User(string userName, string plainTextPassword) 
    { 
     this.UserName = userName; 
     this.Password = GetHash(plainTextPassword); 
    } 
    public string GetHash(string toHash) 
    { 
     return BitConverter.ToString(new SHA256Managed().ComputeHash(Encoding.UTF8.GetBytes(toHash))).Replace("-", string.Empty); 
    } 
    public void Save() { /* Save UserName and the Hashed Password to database */ } 
    public bool ValidateLogin(string userNameEntered, string passwordEntered) 
    { 
     string userName; string password = string.Empty; 
     string ConnectionString = "Your Connection String"; 
     using (SqlConnection con = new SqlConnection(ConnectionString)) 
     { 
      con.Open(); 
      string CommandText = "SELECT UserName, Password FROM userLogin WHERE Username = @UserName"; 
      using (SqlCommand cmd = new SqlCommand(CommandText)) 
      { 
       cmd.Connection = con; 
       cmd.Parameters.Add("@Username", SqlDbType.VarChar, 20).Value = userNameEntered; 
       SqlDataReader rdr = cmd.ExecuteReader(); 
       while (rdr.Read()) 
       { 
        userName = rdr["UserName"].ToString(); 
        password = rdr["Password"].ToString(); 
       } 
      } 
     } 
     if (password.Equals(GetHash(passwordEntered))) return true; 
     return false; 
    } 
} 

這個例子顯示了散列的一個粗略的例子,以及從數據庫中檢索。