我在asp.net
MVC
+ PostgreSQL
上有一个小型Web应用程序。
我有登录页面,人们可以在其中输入他们的登录名/密码。目前,我只有1个用户-admin
。如果登录名和密码正确,则进入mainForm.aspx
页。
但是我需要建立几个用户:user
和director
。 user
登录时,需要将其重定向到user.aspx
页面,director
登录时,需要将其重定向到director.aspx
页面。在所有情况下,都需要从PostgreSQL
数据库进行登录/通过检查。
我该怎么做?
这是我的Login.aspx.cs
代码,只有1个用户:
namespace User1.WebApp
{
public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.UnobtrusiveValidationMode = System.Web.UI.UnobtrusiveValidationMode.None;
}
protected void Button_Login_Click(object sender, EventArgs e)
{
var connString = "Host=localhost;Username=postgres;Password=123;Database=postgres";
using (var conn = new NpgsqlConnection(connString))
{
conn.Open();
string checkuser = "select count(*) from Login where name= '" + TextBoxUserName.Text + "' ";
NpgsqlCommand com = new NpgsqlCommand(checkuser, conn);
int temp = Convert.ToInt32(com.ExecuteScalar().ToString());
if (temp == 1)
{
string checkPasswordQuery = "select password from Login where name= '" + TextBoxUserName.Text + "'";
NpgsqlCommand passCom = new NpgsqlCommand(checkPasswordQuery, conn);
string password = passCom.ExecuteScalar().ToString().Replace(" ", "");
if (password == TextBoxPassword.Text)
{
Session["New"] = TextBoxUserName.Text;
Response.Redirect("MainForm.aspx");
}
else
{
Response.Write("Password is NOT correct !");
}
}
else
{
Response.Write("Username is NOT correct !");
}
}
}
}
}
答案 0 :(得分:1)
您可以在此之前
Response.Redirect("MainForm.aspx");
您可以执行的方法是检查用户类型并采取相应措施。
关于当前代码的评论很少:
Login
表。您的应用程序用户的暴露程度如何? 100%。那里的所有密码都是明文的!您应该以任何方式避免这种情况。幼稚的解决方案是对密码进行哈希处理,每次有人尝试登录以对用户提供的密码进行哈希处理并与您存储的哈希进行比较。 The right way to implement password hashing using PBKDF2 and C#中介绍了一种更专业的密码存储方法。还可以查找类似文章的类似文章。安全性对于您的应用程序至关重要。 答案 1 :(得分:-1)
您是否可以在数据库中存储额外的字段以指定登录名是Admin,User还是Director?
您可以为此使用枚举:
enum LoginRole
{
User = 0,
Director = 1,
Admin = 2
}
此Enum可以作为一个整数字段存储在您的Login表中,称为“角色”或类似名称。然后,您可以根据此角色重定向到适当的页面。
我已经用示例更新了您的代码:
var connString = "Host=localhost;Username=postgres;Password=123;Database=postgres";
using (var conn = new NpgsqlConnection(connString))
{
conn.Open();
string checkuser = "select password, role from Login where name=@username";
using (var com = new NpgsqlCommand(checkuser, conn))
{
com.Parameters.AddWithValue("@username", TextBoxUserName.Text);
using (var reader = com.ExecuteReader())
{
if (reader.Read())
{
string password = reader["password"].ToString();
LoginRole role = (LoginRole)reader["role"];
if (password == TextBoxPassword.Text)
{
Session["New"] = TextBoxUserName.Text;
switch (role)
{
case LoginRole.User:
Response.Redirect("user.aspx");
break;
case LoginRole.Admin:
Response.Redirect("MainForm.aspx");
break;
case LoginRole.Director:
Response.Redirect("director.aspx");
break;
}
}
else
Response.Write("Password is NOT correct !");
}
else
Response.Write("Username is NOT correct !");
}
}
}
请注意,在这种情况下,最好在查询中使用参数,因为将文本框中的字符串直接附加到SQL查询中很容易受到SQL注入的攻击。</ p>
您还需要在每次登录时对数据库进行两次调用-一个用于检查用户名,另一个用于检查密码。我在上面的示例中已经解决了这个问题,只对数据库进行了一次调用。