基于全局组的安全脚本
本文关键字:安全 脚本 于全局 | 更新日期: 2023-09-27 18:26:49
我不确定这是否可能,但我想根据我的用户在SQL Server中创建的特定全局组中的成员身份,将他们限制在Intranet站点的特定区域。
例如,我在ASP中有以下菜单:
<div class="clear hideSkiplink" id="MainMenu">
<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu"
IncludeStyleBlock="False" Orientation="Horizontal"
BackColor="#CC3300">
<Items>
<asp:MenuItem NavigateUrl="~/Default.aspx" Text="Home" Selectable="true" />
<asp:MenuItem NavigateUrl="~/Forms/frmCensusList.aspx" Text="Census Editing"/>
<asp:MenuItem NavigateUrl="~/Forms/frmRoster.aspx" Text="Roster Editing"/>
<asp:MenuItem NavigateUrl="~/Forms/frmReportMenu.aspx" Text="Reporting"/>
<asp:MenuItem NavigateUrl="~/About.aspx" Text="About"/>
<%-- <asp:MenuItem NavigateUrl="~/WebForm1.aspx" Text="Test"/>--%>
</Items>
</asp:Menu>
</div>
然后下面的代码背后限制了什么"安全级别"可以看到"关于"页面:
protected void Page_Load(object sender, EventArgs e)
{
string path = Request.AppRelativeCurrentExecutionFilePath;
foreach (MenuItem item in NavigationMenu.Items)
{
item.Selected = item.NavigateUrl.Equals(path, StringComparison.InvariantCultureIgnoreCase);
}
// If the user isn't an Admin, hide the About menu option
string ActiveUser = System.Web.HttpContext.Current.User.Identity.Name;
string SecurityLevel = ActiveUser.SecLevel();
if (SecurityLevel != "ADMIN")
{
MenuItem mnuItem = NavigationMenu.FindItem("About"); // Find particular item
if (mnuItem != null)
{
NavigationMenu.Items.Remove(mnuItem);
}
}
}
SecLevel()是我创建的一个基于用户ID表的函数,但维护该表是一件痛苦的事,加上未来的项目将是编译原始表的痛苦,如果我能基于现有的全局组来做这件事会更容易。
有人有什么建议吗?
您的全局组可能只是Active Directory安全组。通过使用内置的ASP.NET角色提供程序、web.config条目来控制哪些组/角色可以查看哪些菜单项,并将菜单控件绑定为使用web.itemap文件,您可以轻松完成此操作。所有这些都与securityTrimingEnabled结合在一起。将确保您的菜单选项显示给您定义的组中的用户。如果这些不是AD组,您仍然可以执行此操作,但必须创建一个自定义角色提供程序,该提供程序可以根据您的SQL Server组进行检查,或者只需使用您已经创建的表。
根据您提供的示例,您的web.config location
条目最终会看起来像这样,每个页面都有您想要让用户看到的条目:
<configuration>
<location path="~/About.aspx">
<system.web>
<authorization>
<allow roles="ADMIN"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<location path="~/Forms/frmCensusList.aspx">
<system.web>
<authorization>
<allow roles="CENSUS,ADMIN,ETC"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<location path="~/Forms/frmRoster.aspx">
<system.web>
<authorization>
<allow roles="ADMIN,ROSTER"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
...
</configuration>
<system.web>
<siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
<providers>
<add name="XmlSiteMapProvider"
description="Default SiteMap provider."
type="System.Web.XmlSiteMapProvider "
siteMapFile="Web.sitemap"
securityTrimmingEnabled="true" />
</providers>
</siteMap>
</system.web>
示例web.sitemap:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="~/forms/frmCensusList.aspx" title="Census" description="" roles="ADMIN,CENSUS">
<siteMapNode url="~/forms/frmRoster.aspx" title="Roster Editing" description="" roles="ADMIN,ROSTER">
<siteMapNode url="~/forms/frmReportMenu.aspx" title="Reporting" description="" roles="ADMIN,REPORTS">
...
<siteMapNode url="~/About.aspx" title="About" description="" roles="ADMIN">
</siteMap>
有关更多信息,请参阅此SO文章。
1.创建一个MainMasterPage、一个UserMasterPage和一个AdminMasterPage
2.UserMasterPage和AdminMasterPage使用MainMasterPage
3.在MainMasterPage中输入菜单
4.在登录页面中,如果用户和密码有效:
Session["ActiveUser"] = txtUsername.Text;
Session["SecurityLevel"] = //get role to ActiveUser from database and set to this session.
5.in UserMasterPage Page_Load:
if(Session["SecurityLevel"]==null)
{
Response.Redirect("~/login.aspx");//go to login page
}
else
{
if(Session["SecurityLevel"].ToString()!="User")
{
Response.Redirect("~/login.aspx");//go to login page
}
}
6.在AdminMasterPage Page_Load:中
if (Session["SecurityLevel"] == null)
{
Response.Redirect("~/login.aspx");//go to login page
}
else
{
if (Session["SecurityLevel"].ToString() != "ADMIN")
{
Response.Redirect("~/login.aspx");//go to login page
}
}
7.然后管理页面使用AdminMasterPage,用户页面使用UserMasterPage。
我认为你可以通过角色管理的方式来做到这一点,如果你这样做,你可以很容易地做到,对于
if (!System.Web.HttpContext.Current.User.IsInRole("ADMIN"))
{
MenuItem mnuItem = NavigationMenu.FindItem("About"); // Find particular item
if (mnuItem != null)
{
NavigationMenu.Items.Remove(mnuItem);
}
}
使用会更直接
NavigationMenu.Items.RemoveAt(0);
这将删除第一个菜单项
NavigationMenu.Items[0].ChildItems.RemoveAt(1);
这将删除第一个菜单项的第二个子项
NavigationMenu.Items[0].ChildItems[1].ChildItems.RemoveAt(1)
这将删除第一个菜单项的第二个子项的第二个子项