c# - 基于角色的身份验证

标签 c# asp.net sql-server tsql stored-procedures

我正在尝试使用角色创建身份验证。我在 SQL Server 中创建了一个表 Users 和一个存储过程以在用户有效时返回 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 返回为 UserId=8) 请注意,当我执行存储过程时,我得到了正确的结果。

提前致谢。

最佳答案

在读取输出参数之前使用以下命令执行存储过程:

cmd.ExecuteNonQuery();

关于c# - 基于角色的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32964942/

相关文章:

python - PyODBC 从简单的 SELECT 子句获取结果

c# - 如何检索部分存储在数据库中的日期列表并将其绑定(bind)在c#中的gridview中

java - 在 Java 中解密 C# AES 加密文本

c# - asp.net 如何在行与行之间添加分隔符

c# - "ASP.global_asax does not exist in the namespace ASP"

sql-server - 如何从 EXEC sp_executeSql 中选择?

sql-server - "Allow access to Azure services"默认关闭ARM模板

c# - 如何使用 HttpContext 获取 int 值而不是 string 值?

c# - 加快从集合中查找数据范围

c# - 如何从代码向 Umbraco 中的文档类型添加属性?