使用存储过程进行身份验证
本文关键字:身份验证 存储过程 | 更新日期: 2023-09-27 17:50:55
我已经在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
使用输出参数返回用户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将其改为SELECT COUNT(1) FROM userLogin....
,然后在SqlDataReader对象上使用ExecuteScalar()
。
作为旁注,以纯文本形式将密码存储在DB中不是一个好主意,而是将它们散列,最好使用salt值。
不将明文密码存储在数据库中。查找哈希方法。在下面的例子中,我使用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;
}
}
这个示例显示了一个粗略的散列示例以及从数据库检索。