2013-08-07 15 views
7

Non sono sicuro che sia possibile, ma vorrei limitare i miei utenti a specifiche aree di un sito Intranet in base alla loro appartenenza a specifici gruppi globali creati in SQL Server.Script di sicurezza basato sul gruppo globale?

Per esempio, ho il seguente menu in 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> 

E allora la seguente nel codice dietro che limita ciò che "livello di sicurezza" può vedere la pagina "About":

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() è una funzione che ho creato basata su una tabella di ID utente, ma mantenere la tabella è un problema, inoltre i progetti futuri saranno un problema per compilare la tabella originale e sarà più semplice se posso farlo in base ai gruppi globali esistenti.

Qualcuno ha qualche suggerimento?

+1

Dipende. DBA e amministratore di rete non sono necessariamente la stessa persona. Hai accesso ai gruppi globali? Di solito DBA rimuove Domain Admin Global Group dagli amministratori locali quando SQL Server è stato configurato/istallato. Temo che potresti scoprire che l'approccio "a tavolo separato" è la tua opzione dopotutto. –

+0

AFAIK, i gruppi globali non vengono creati in SQL Server, sono creati in un dominio (in particolare in AD). Possono quindi essere aggiunti a SQL Server come accesso, ma SQL Server non li gestisce e dispone di funzioni limitate per interrogarli. – RBarryYoung

risposta

5

I tuoi gruppi globali sono probabilmente solo gruppi di sicurezza di Active Directory. È possibile farlo senza troppe difficoltà utilizzando il provider di ruoli ASP.NET incorporato, le voci web.config per controllare quali gruppi/ruoli possono vedere quali voci di menu e vincolare il controllo menu per utilizzare un file web.sitemap. Tutto questo combinato con securityTrimmingEnabled. assicurerà che le opzioni di menu vengano mostrate agli utenti nei gruppi che hai definito. Se non si tratta di gruppi di annunci, è ancora possibile farlo, ma è necessario creare uno Custom Role Provider che potrebbe verificare i gruppi di SQL Server o semplicemente utilizzare la tabella già creata.

web.config location voci finiranno cercando qualcosa di simile sulla base dell'esempio che hai fornito, con le voci per ciascuna delle pagine che si desidera consentire all'utente di vedere:

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

Esempio web. Mappa del sito:

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

Vedi this SO article per ulteriori informazioni

1

1.Creare un MainMasterPage e un UserMasterPage e Adm inMasterPage.
2.UserMasterPage e AdminMasterPage utilizzano da MainMasterPage.
3. Inserire il menu in MainMasterPage.
4.In pagina di login, se utente e la password è valida:

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 le pagine di amministrazione vengono utilizzate da AdminMasterPage e le pagine utente vengono utilizzate da UserMasterPage.

1

Penso che si possa fare questo role managing way, Se lo fate in questo modo, facilmente si può fare, per

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

Sarebbe più dritto in avanti per usare

NavigationMenu.Items.RemoveAt(0); 

Questa volontà rimuovere il primo menuitem

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

Questo rimuoverà il secondo figlio del primo menu menu

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

Questo eliminerà il secondo figlio del secondo figlio del pugno MenuItem