2015-10-06 232 views
2

我正嘗試使用角色創建身份驗證。我已經在SQL Server中創建了一個表用戶,並且存儲過程返回UserId和UserRole(如果用戶有效,如下所示)。基於角色的身份驗證

CREATE TABLE [dbo].[Users] 
([UserID] [int] IDENTITY(1,1) NOT NULL, 
[Username] [nvarchar](20) NOT NULL, 
[Password] [nvarchar](20) NOT NULL, 
[Email] [nvarchar](30) NOT NULL, 
[CreatedDate] [datetime] NOT NULL, 
[LastLoginDate] [datetime] NULL, 
[UserRole] [nvarchar](20) NULL 
) 



CREATE PROCEDURE [dbo].[Validate_User] 
@Username NVARCHAR(20), 
@Password NVARCHAR(20), 
@UserRole NVARCHAR(20) OUTPUT, 
@UserId INT OUTPUT 
AS 
BEGIN 
SET NOCOUNT ON; 
DECLARE @LastLoginDate DATETIME 
SELECT @UserId = UserId, @LastLoginDate = LastLoginDate, @UserRole=UserRole 
FROM Users WHERE Username = @Username AND [Password] = @Password 
IF @UserId IS NOT NULL 
BEGIN 
UPDATE Users 
SET LastLoginDate = GETDATE() 
WHERE UserId = @UserId 
SELECT @UserId [UserId], @UserRole [UserRole] 
END 
ELSE 
BEGIN 
SELECT @UserId=-1 
END 
END 

這是在asp.net的代碼,用於驗證用戶:

protected void ValidateUser(object sender, EventArgs e) 
{ 
int userId = 0; 
string constr = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString; 
using (SqlConnection con = new SqlConnection(constr)) 
{ 
using (SqlCommand cmd = new SqlCommand("Validate_User")) 
{ 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.AddWithValue("@Username", Login1.UserName); 
cmd.Parameters.AddWithValue("@Password", Login1.Password); 
cmd.Parameters.Add("@UserRole", SqlDbType.NVarChar); 
cmd.Parameters["@UserRole"].Direction = ParameterDirection.Output; 
cmd.Parameters.AddWithValue("@UserId", SqlDbType.Int); 
cmd.Parameters["@UserId"].Direction = ParameterDirection.Output; 
cmd.Connection = con; 
con.Open(); 
userId = Convert.ToInt32(cmd.Parameters["@UserId"].Value); 
Session["userRole"] = Convert.ToString(cmd.Parameters["@UserRole"].Value); 
Session["userId"]=Convert.ToInt32(cmd.Parameters["@UserId"].Value); 
con.Close(); 
} 
switch (userId) 
{ 
case -1: 
Login1.FailureText = "Username and/or password is incorrect."; 
break; 
default: 
FormsAuthentication.RedirectFromLoginPage(Login1.UserName, Login1.RememberMeSet); 
break; 
} 
} 
} 

的問題是,UserRole的始終返回空值和用戶ID返回一個身份是無效的(例如用戶名= 1在數據庫返回UserId = 8) 請注意,當我執行存儲過程時,我得到正確的結果。

預先感謝您。

+1

我沒有看到一個調用執行存儲過程。 –

+2

當ASP.NET已經提供了這個功能時,爲什麼要創建自己的身份驗證機制?忘記執行存儲過程是您最小的擔心 - 使用短的,未加密的,未加密的密碼要糟糕得多,尤其是當這個功能已經*可用時。俗話說,「這將用於對付你」,當發生違規時 –

+0

你的意思是與會員合作? – Chriz

回答

0

讀取輸出參數之前執行使用下面的命令存儲過程:

cmd.ExecuteNonQuery(); 
+0

謝謝你的回答。 – Chriz

+0

你能把它標記爲答案嗎?還有,它是否適合你? –

+0

是的,它確實謝謝你,我也改變了這一行, cmd.Parameters.Add(「@ UserRole」,SqlDbType.NVarChar,20); – Chriz

相關問題