基于Global Group的安全脚本?

时间:2013-08-07 15:18:36

标签: c# asp.net sql-server usergroups

我不确定这是否可行,但我想根据用户在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> 

然后,Code Behind中的以下内容限制了“安全级别”可以看到“关于”页面:

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表的函数,但是维护表是一件痛苦的事,加上未来的项目将会很难编译原始表,如果这样做会更容易我可以根据现有的全球小组来做到这一点。

有人有任何建议吗?

4 个答案:

答案 0 :(得分:5)

您的全局组可能只是Active Directory安全组。通过使用内置的ASP.NET角色提供程序,web.config条目来控制哪些组/角色可以查看哪些菜单项,并将菜单控件绑定到使用web.sitemap文件,您可以轻松完成此操作。所有这些都与securityTrimmingEnabled相结合。将确保您的菜单选项显示给您已定义的组中的用户。如果这些不是AD组,您仍然可以执行此操作,但必须创建一个Custom Role Provider,它可以检查您的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>

有关详细信息,请参阅this SO article

答案 1 :(得分:1)

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.在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.in 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。

答案 2 :(得分:1)

我认为您可以通过role managing way执行此操作,如果您这样做,您可以轻松地执行此操作,

if (!System.Web.HttpContext.Current.User.IsInRole("ADMIN"))
    {
        MenuItem mnuItem = NavigationMenu.FindItem("About"); // Find particular item
        if (mnuItem != null)
        {
            NavigationMenu.Items.Remove(mnuItem);
        }
    }

答案 3 :(得分:0)

使用

会更直接
NavigationMenu.Items.RemoveAt(0);

这将删除第一个menuitem

NavigationMenu.Items[0].ChildItems.RemoveAt(1);

这将删除第一个菜单项的第二个孩子

NavigationMenu.Items[0].ChildItems[1].ChildItems.RemoveAt(1)

这将删除第一个菜单项的第二个孩子的第二个孩子