【问题标题】:asp.net MVC. How ho make redirect to .aspx page depending on user privilege [duplicate]ASP.NET MVC。如何根据用户权限重定向到.aspx页面[重复]
【发布时间】:2018-08-08 14:36:01
【问题描述】:

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

我有登录页面,人们在其中输入他们的登录名/密码。现在我只有 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 !");
                }
            }
        }
    }
}

【问题讨论】:

  • 我在您的示例中没有看到任何尝试这样做的尝试,因此不认为您的问题对于 SO 来说是可以的,至少在没有编辑和进一步表明您尝试过的情况下是这样。这也是一个非常广泛的问题,有很多不同的方法可以实现你想要的......
  • 是的,我知道...我是 C# 和编程的新手...刚开始编写我的第一个 Web 应用程序...所以我只是不知道该怎么做.
  • @badahboom ASP.NET 已经具有强加密身份验证和授权。您不需要 任何 代码。事实上,这会让你上法庭并处以 GDPR 罚款。此代码对 SQL 注入攻击开放,只需输入 ' OR 1=1;-- 作为用户名或密码即可泄露所有用户名和密码。
  • @badahboom 不要尝试创建自己的身份验证和授权。使用内置的well documented ASP.NET 身份系统。它包含在所有 ASP.NET MVC 教程中。检查角色和权限称为authorization。检查角色只需User.IsInRole(someRole) 以检查用户的角色或GetRoles() 以获取所有角色
  • @badahboom 您认为过去几年所有这些密码泄露事件是如何发生的?这可不是说笑。事实上,ASP.NET 避免这些问题准确地因为它已经提供了强身份验证。

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


【解决方案1】:

你可以在之前这样做

 Response.Redirect("MainForm.aspx");

您可以做到这一点的方法是检查用户的类型并采取相应的行动。

关于当前代码的几个 cmets:

  • 在 web.config 中设置连接字符串并从那里读取它,而不是在代码中硬编码,例如here
  • 您创建 SQL 语句的方式使您的应用程序容易受到SQL injection 的攻击,这是黑客入侵网站的最常见方式之一。与其这样做,不如选择parameterized queries
  • 您对数据库进行了两次往返,以检查用户是否存在,然后获取她的密码。如果您想获取更多信息,例如用户类型,该怎么办?你会再做一次往返。只要您可以根据用户名等独特的东西来识别您的用户,您就可以将所有这些都消除到一次往返中。只需获取特定用户名的所有数据。
  • 让某人可以访问您数据库的Login 表。您的应用程序用户暴露程度如何? 100%。那里的所有密码都是明文!你应该以任何方式避免这种情况。一个天真的解决方案是对密码进行哈希处理,每次有人尝试登录时对用户提供的密码进行哈希处理,并与您存储的哈希值进行比较。 The right way to implement password hashing using PBKDF2 and C# 描述了一种更专业的密码存储方法。还可以查找与上述文章类似的文章。安全性对您的应用程序至关重要。

【讨论】:

    【解决方案2】:

    您能否在数据库中存储一个额外的字段来指定登录是管理员、用户还是主管?

    您可以为此使用枚举:

    enum LoginRole
    {
        User = 0,
        Director = 1,
        Admin = 2
    }
    

    这个枚举可以作为一个整数字段存储在您的登录表中,称为“角色”或类似名称。然后,您可以根据此角色重定向到相应的页面。

    我已经用一个例子更新了你的代码:

    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 注入的攻击。

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

    【讨论】:

    • 谢谢!这正是我想要的! “您能否在数据库中存储一个额外的字段来指定登录是管理员、用户还是主管?” - 是的,我有两个表 - 通过外键连接的用户和角色
    • @badahboom 这实际上是一个非常糟糕的代码,可以让你被解雇或让你上法庭。 ASP.NET 已经具有强密码身份验证授权。这个答案和原始代码都对 SQL 注入攻击开放,并且可以泄露 所有用户名和密码。只需输入' OR 1=1;-- 作为用户名
    • This is a clear explanation 为什么这段代码如此糟糕。它也不需要。一次调用User.IsInRole("somerole") 即可检查角色
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2021-05-04
    相关资源
    最近更新 更多