asp.net MVC。如何根据用户权限重定向到.aspx页

时间:2018-08-08 14:36:02

标签: c# asp.net postgresql security model-view-controller

我在asp.net MVC + PostgreSQL上有一个小型Web应用程序。

我有登录页面,人们可以在其中输入他们的登录名/密码。目前,我只有1个用户-admin。如果登录名和密码正确,则进入mainForm.aspx页。

但是我需要建立几个用户:userdirectoruser登录时,需要将其重定向到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 !");
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以在此之前

 Response.Redirect("MainForm.aspx");

您可以执行的方法是检查用户类型并采取相应措施。

关于当前代码的评论很少:

  • 在web.config中设置连接字符串,然后从那里读取它,而不是在您的代码中对其进行硬编码,例如here
  • 创建SQL语句的方式使您的应用程序容易受到SQL injection的攻击,这是某人入侵网站的最常见方法之一。最好不要使用parameterized queries
  • 您需要两次往返数据库,以检查用户是否存在,然后获取密码。如果要获取诸如用户类型之类的更多信息怎么办?您将再进行一次往返。如果您可以根据用户名之类的唯一标识来识别用户,则可以将所有这些操作消除为一次往返。只需获取特定用户名的所有数据即可。
  • 让某人可以访问您数据库的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>

您还需要在每次登录时对数据库进行两次调用-一个用于检查用户名,另一个用于检查密码。我在上面的示例中已经解决了这个问题,只对数据库进行了一次调用。