2013-08-07 17 views
7

Nie jestem pewien, czy jest to możliwe, ale chciałbym ograniczyć moich użytkowników do określonych obszarów witryny intranetowej w oparciu o ich przynależność do określonych grup globalnych utworzonych w SQL Server.Skrypt zabezpieczający oparty na Global Group?

Na przykład, mam następujące menu w 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> 

A potem następne w Kodeksie Behind że ogranicza co „poziom bezpieczeństwa” widzi „O” stronie:

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() to funkcja, którą utworzyłem na podstawie tabeli identyfikatorów użytkownika, ale utrzymanie stołu to ból, a przyszłe projekty będą trudne do skompilowania oryginalnego stołu, a będzie po prostu łatwiej jeśli mogę to zrobić w oparciu o istniejące grupy globalne.

Ktoś ma jakieś sugestie?

+1

to zależy. DBA i administrator sieci to niekoniecznie ta sama osoba. Czy masz dostęp do grup globalnych? Zwykle DBA usuwa Domain Admin Global Group od lokalnych administratorów, gdy SQL Server jest skonfigurowany/zainstalowany. Obawiam się, że może się okazać, że podejście "oddzielnej tabeli" jest Twoją opcją. –

+0

AFAIK, Grupy globalne nie są tworzone w SQL Server, są tworzone w domenie (konkretnie w AD). Można je następnie dodać do SQL Server jako login, ale SQL Server nie administruje nimi i ma ograniczone funkcje do ich przesłuchiwania. – RBarryYoung

Odpowiedz

5

Twoje globalne grupy to prawdopodobnie tylko grupy zabezpieczeń usługi Active Directory. Możesz to zrobić bez większych trudności, używając wbudowanego dostawcy ASP.NET Rola Provider, web.config, aby kontrolować, które grupy/role mogą zobaczyć, które elementy menu i wiążą kontrolkę menu, aby użyć pliku web.sitemap. Wszystko to w połączeniu z securityTrimmingEnabled. zapewni, że opcje menu zostaną pokazane użytkownikom w zdefiniowanych grupach. Jeśli nie są to grupy AD, nadal możesz to zrobić, ale musisz utworzyć Custom Role Provider, które może sprawdzić w stosunku do grup SQL Server lub po prostu użyć tabeli, którą już utworzyłeś.

Twój web.config location wpisy skończy się szuka czegoś takiego na przykładzie podany z wpisami dla każdej ze stron, które chcesz, aby umożliwić użytkownikowi zobaczyć:

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

internecie próbki. Mapa strony:

<?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 Zobacz więcej informacji

1

1.Create się MainMasterPage i UserMasterPage i Adm inMasterPage.
2.UserMasterPage i AdminMasterPage używają z MainMasterPage.
3. Wprowadź menu w MainMasterPage.
4.In jeśli strona logowania użytkownika i hasło jest poprawne:

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.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.Then strony administracyjne korzystają z AdminMasterPage i stron użytkownika z UserMasterPage.

1

myślę, że można to zrobić przez role managing way, Jeśli nie w ten sposób, można łatwo zrobić, dla

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

To byłoby bardziej proste w użyciu

NavigationMenu.Items.RemoveAt(0); 

Będzie usuń pierwsze menuitem:

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

Spowoduje to usunięcie drugiego dziecka z pierwszego menuitem

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

To usunie drugie dziecko drugiego dziecka pięści menuitem