我正在主编一个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页面,它目前在Production中运行。我不想在每个页面加载中包含相同的代码(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;
}
}
}
Index.aspx
Page_load
{
string CurrentUser = UtilFunctions.getLoggedOnUser();
}
答案 0 :(得分:0)
你有几个选择,在这里:
1)使用Owin或AspNet.Identity设置基于角色的访问。这可能是你最好的选择,但我找不到适合你的好教程。但是,这些软件包已有详细记录,我确信您可以通过一些努力来解决这些问题。
2)构建Roles表,并自行定制访问权限。我找到的最好的例子是: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();
}
}
我不确定该选项是否非常安全,但它应该有效。
希望有所帮助!
答案 1 :(得分:0)
设置角色后,您可以在指定authorization的每个目录中使用web.config文件和/或使用web.config文件中的“location”元素。
答案 2 :(得分:0)
首先,抱歉令人困惑的代码。我一直在使用MVC,你已经清楚地发布了你的代码。
我认为您无法在不向每个页面添加代码或了解角色的情况下实现您的目标。你可以通过一些聪明的方式减少一些代码重复,但我想不出任何看起来不像完全黑客的东西。
如果您希望将所有安全页面放在同一目录中,并限制对该目录的低级访问,则必须按特定用户进行过滤,或者如果您可以实现这些目标,则必须对其进行过滤。据我了解,web.config文件中的拒绝和允许节点正在设置服务器端(可能是IIS)授权规则,因此您可以使用的关键字和规则是有限的。查看此页面,了解一些基础知识:
虽然根据您的数据库中的值构建规则可能是可能的,但这样做可能会比它的价值要多得多。
很抱歉,我无法提供更满意的答案,但我建议:1)开始工作,并为每个页面后面的代码添加一个检查,或者2)(我强烈建议这个选项)关闭这个问题,并发布另一个问题,关于在.net中实现角色,以及在代码中为用户分配角色。例如,如果您可以使用登录页面为每个初级用户分配Junior的自定义角色,并将所有安全页面放在名为SecurePages的目录中,则可以将以下代码添加到web.config中,并完全实现你想做什么:
<location path="SecurePages">
<system.web>
<authorization>
<deny roles="Junior">
<deny users="*">
</authorization></system.web></location>
祝你好运!