2015-10-06 2 views
2

Я пытаюсь создать аутентификацию с ролями. Я создал таблицу Users в 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 всегда возвращается как нуль и UserId возвращает идентификатор, который не является допустимым (например UserID = 1 на db возвращается как UserId = 8) Обратите внимание, что при выполнении хранимой процедуры я получаю правильные результаты.

Заранее спасибо.

+1

Я не вижу вызов для выполнения хранимой процедуры. –

+2

Почему вы пытаетесь создать свой собственный механизм аутентификации, когда ASP.NET уже предоставляет эту функцию? Забыть выполнить хранимую процедуру является наименьшей из ваших забот - использование коротких незашифрованных несоленых паролей намного хуже, особенно если эта функция уже доступна *. Как говорится, «это будет использовано против вас», когда произойдет нарушение. –

+0

Вы имеете в виду работу с членством? – Chriz

ответ

0

выполнить хранимую процедуру с помощью следующей команды перед чтением выходных параметров:

cmd.ExecuteNonQuery(); 
+0

Благодарим вас за ответ. – Chriz

+0

можете ли вы отметить это как ответ. Также, это сработало для вас? –

+0

Да, спасибо, я тоже изменил эту строку, cmd.Parameters.Add («@ UserRole», SqlDbType.NVarChar, 20); – Chriz

Смежные вопросы