7

我不确定这是否可行,但我想根据他们在 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 表的函数,但是维护表很痛苦,而且未来的项目编译原始表会很痛苦,如果我能做到,它会更容易这基于现有的全球集团。

有人有什么建议吗?

4

4 回答 4

5

您的全局组可能只是 Active Directory 安全组。您可以通过使用内置的 ASP.NET 角色提供程序、web.config 条目来控制哪些组/角色可以看到哪些菜单项,并将您的菜单控件绑定到使用 web.sitemap 文件,从而轻松做到这一点。所有这些都与securityTrimmingEnabled相结合。将确保您的菜单选项显示给您定义的组中的用户。如果这些不是 AD 组,您仍然可以这样做,但必须创建一个自定义角色提供程序,它可以检查您的 SQL Server 组或仅使用您已经创建的表。

根据您提供的示例,您的 web.configlocation条目最终将看起来像这样,其中包含您希望允许用户查看的每个页面的条目:

  <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 文章

于 2013-08-15T14:19:33.547 回答
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。

于 2013-08-17T02:52:26.403 回答
1

我认为你可以通过角色管理的方式来做到这一点 ,如果你这样做,你可以很容易地做到这一点,因为

if (!System.Web.HttpContext.Current.User.IsInRole("ADMIN"))
    {
        MenuItem mnuItem = NavigationMenu.FindItem("About"); // Find particular item
        if (mnuItem != null)
        {
            NavigationMenu.Items.Remove(mnuItem);
        }
    }
于 2013-08-20T06:03:53.990 回答
0

使用起来会更直接

NavigationMenu.Items.RemoveAt(0);

这将删除第一个菜单项

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

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

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

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

于 2013-08-21T11:24:54.740 回答