【问题标题】:Restrict access to all asp.net pages限制对所有 asp.net 页面的访问
【发布时间】:2015-09-22 18:45:16
【问题描述】:

我正在主线一个asp.net项目,这个项目是在IIS中配置的。该网站对所有人开放,当我查看 asp.net 页面中的代码时,其检查窗口登录“企业 ID”并允许所有用户查看所有 aspx 页面。

现在,我的管理团队要求我们限制那些低于初级员工的人员​​。(初级工程师、开发人员、软件工程师)。

我已经编写了查询,传递企业 id 并验证等级,如果是初级级别,则返回“0”值,否则返回“1”值。

我的问题是,我不想去编辑每个页面并检查此查询并限制每个页面。

您能否建议,我怎样才能实施最简单和最好的方法来限制用户。

谢谢, -------------------------------------- 2015 年 9 月 24 日更新

Index.aspx 

protected void Page_Load(object sender, EventArgs e)
    {
        string UserStatus = UtilFunctions.ValidateUser();
        Response.Write(UserStatus);
        if (UserStatus == "0")
        {
            Response.Write("<div><font color=red><h1>You are not authorized to view this page</h1></font></div>");
            Response.End();
        }
     }


Utilifunctions.cs 
    public static String ValidateUser()
    {
       
        string CurrentUser = getLoggedOnUser();
        using (System.Data.SqlClient.SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString))
        {
            using (SqlCommand myCommand = myConnection.CreateCommand())
            {
                
                myConnection.Open();//Opens the Connection
                myCommand.CommandText = "Select Permission From Temp_Validate Where EnterpriseId='" + CurrentUser + "'";
                SqlDataReader IDReader = myCommand.ExecuteReader(); //Gets the ID
                IDReader.Read();
                string UserStatus = IDReader["Permission"].ToString();
                IDReader.Close();
                return UserStatus;
            }
        }

我在我的 index.aspx 页面中实现了上述功能,如果 userstatus 等于 "0" ,它将显示“您无权查看此消息”并结束。

我有大约 30 个 aspx 页面,它目前在生产中运行。我不想在每个页面加载中都包含相同的代码(index.aspx)来停止用户验证。

您能否建议我如何在不编辑所有页面的情况下实施。

09/28 更新:Utilifunction.cs

public static String getLoggedOnUser()
    {    
        String user = HttpContext.Current.User.Identity.Name.Substring(HttpContext.Current.User.Identity.Name.IndexOf("\\") + 1);
        if (user == "") user = "anonymous";

        string UserStatus = IsValidUser(user);

        if (UserStatus == "0")
        {
            HttpContext.Current.Response.Redirect("PSF_Error.aspx", true);
        }
        return user;            
    }

    public static String IsValidUser(string currentUser)
    {
      
        using (System.Data.SqlClient.SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString))
        {
            using (SqlCommand myCommand = myConnection.CreateCommand())
            {
                //Gets email of the creator of current user
                myConnection.Open();//Opens the Connection
                myCommand.CommandText = "Select Permission From Temp_Validate Where EnterpriseId='" + currentUser + "'";
                SqlDataReader IDReader = myCommand.ExecuteReader(); //Gets the ID
                IDReader.Read();
                string UserStatus = IDReader["Permission"].ToString();
                IDReader.Close();
                return UserStatus;
            }
        }


    }

索引.aspx

Page_load
{
string CurrentUser = UtilFunctions.getLoggedOnUser();

}

【问题讨论】:

  • 您从哪里获得成绩验证值?即,应用程序如何知道用户是否是初级用户?通常,应使用角色和 web.config 文件设置页面访问权限。您可以在此处看到一个类似问题的非常简单的答案:forums.asp.net/t/… 基本上,您根据逐页或目录规则设置访问权限。不过,我不确定这是否适用于您的项目。
  • 我有两个表“员工”-员工 ID、姓名、职务,第二个表:职务职务 ID、姓名、级别。示例:如果我加入两个表,员工姓名:Mark,12(titleID),Contractor(Title),S4(级别),我不想在所有页面中允许 s4 级别的用户。
  • 您可能想要实现您的自定义角色提供程序。一旦你设置和配置了它(在 web.config 中),你可以在后面的代码中完成它。
  • 我明白了。 @achan 是对的,如果您想在业务端逻辑中处理这一切。一个更简单的选择是根据员工的级别向员工提供登录凭据(用户名和密码),但这不是大型企业的合适解决方案,也不是非常安全。我会尽力为您找到一个设置角色的好教程。

标签: asp.net restrict


【解决方案1】:

这里有几个选项:

1) 使用 Owin 或 AspNet.Identity 设置基于角色的访问。这可能是您最好的选择,但我找不到适合您的好教程。不过,这些包的文档有据可查,我相信您可以通过一些努力来弄清楚它们。

2) 构建角色表,并自己自定义访问权限。我找到的最好的例子在这里:http://www.codeproject.com/Articles/875547/Custom-Roles-Based-Access-Control-RBAC-in-ASP-NET

3) 不使用角色重定向未经授权的用户。所以像:

public ActionResult SecurePage(User u)
{
    if(u.level == "junior"){
        return RedirectToAction("CustomErrorPage");
    } else {
        return View();
    }
}

我不确定该选项是否非常安全,但它应该可以工作。

希望有帮助!

【讨论】:

  • 谢谢,我研究过但无法实施上述 2 建议。我已经编辑了我的代码,您能否在不编辑每一页的情况下提供实现此功能的建议。谢谢,
【解决方案2】:

设置角色后,您可以在每个指定authorization 的目录中使用 web.config 文件和/或使用 web.config 文件中的“位置”元素。

【讨论】:

    【解决方案3】:

    首先,对于令人困惑的代码,我们深表歉意。我一直在使用MVC,你已经清楚地把你的代码贴在后面了。

    我认为如果不将代码添加到每个页面或了解角色,您就无法实现您想要做的事情。您可以通过多种巧妙的方式减少一些代码重复,但我想不出任何看起来不像完全破解的方法。

    如果您想将所有安全页面放在同一个目录中,并限制对该目录的低级别访问,您将不得不按特定用户进行过滤,或者,如果您可以实现它们,角色.据我了解,您的 web.config 文件中的拒绝和允许节点正在设置服务器端(可能是 IIS)授权规则,因此您可以使用的关键字和规则是有限的。查看此页面,了解一些基础知识:

    http://weblogs.asp.net/gurusarkar/setting-authorization-rules-for-a-particular-page-or-folder-in-web-config

    虽然可以根据数据库中的值构建规则,但这样做的工作量可能远远超过其价值。

    抱歉,我无法提供更令人满意的答案,但我建议:1) 开始工作,并在每个页面后面的代码中添加检查,或 2)(我强烈建议使用此选项)关闭这个问题,并发布另一个,关于在.net 中实现角色,并在代码中为用户分配角色。例如,如果您可以使用您的登录页面为每个初级用户分配 Junior 的自定义角色,并将所有安全页面放在名为 SecurePages 的目录中,您可以将以下代码添加到您的 web.config,并准确实现你想做什么:

    <location path="SecurePages">
        <system.web>
        <authorization>
            <deny roles="Junior">
            <deny users="*">
    </authorization></system.web></location>
    

    祝你好运!

    【讨论】:

    • 谢谢,它不适用于我的项目。页面内部有很多复杂的代码,每个页面都是独立的。
    • 我在主页上发布的代码一。当我从cs文件重定向页面时有什么问题吗? ?如果用户未验证,我计划从 cs 文件重定向错误页面。 HttpContext.Current.Response.Redirect("PSF_Error.aspx", true);
    • 索引页面加载时,如果用户有效,它将起作用,否则,cs文件重定向到错误页面。你能建议我吗,我实施的方式是否正确?谢谢,
    • 这取决于您想要的安全程度。角色更好,就像在每个页面上实现重定向一样。受限用户只需在浏览器中键入“yourdomain.com/Products”或其他任何内容,即可绕过索引页面。此外,对应用程序架构有更多了解的人可能能够我不完全确定您重定向的页面不会被缓存,这在您的情况下可能无关紧要。简而言之:这是我在下面建议的三个选项中最糟糕的一个,但它应该可以防止受限用户正常浏览您的网站。
    猜你喜欢
    • 2023-03-15
    • 2021-06-07
    • 2015-05-10
    • 1970-01-01
    • 2023-01-19
    • 2023-04-09
    • 1970-01-01
    • 2018-06-06
    相关资源
    最近更新 更多