Я пытаюсь создать аутентификацию с ролями. Я создал таблицу 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) Обратите внимание, что при выполнении хранимой процедуры я получаю правильные результаты.
Заранее спасибо.
Я не вижу вызов для выполнения хранимой процедуры. –
Почему вы пытаетесь создать свой собственный механизм аутентификации, когда ASP.NET уже предоставляет эту функцию? Забыть выполнить хранимую процедуру является наименьшей из ваших забот - использование коротких незашифрованных несоленых паролей намного хуже, особенно если эта функция уже доступна *. Как говорится, «это будет использовано против вас», когда произойдет нарушение. –
Вы имеете в виду работу с членством? – Chriz