You are currently browsing the tag archive for the ‘security trimming’ tag.

A volte operazioni semplici sulla carta si rivelano più complicate del previsto.

Per semplificare la struttura degli accessi e delle autorizzazioni di un’applicazione web realizzata con ASP.NET 3.5 ho pensato di utilizzare un menu costruito tramite Sitemap regolando la possibilità di accedere alle voci di menu utilizzando i ruoli degli utenti.
In pratica per ogni nodo del file xml sitemap voglio definire i gruppi autorizzati a visualizzare la voce stessa di menu e ad accedere alle pagine.

La struttura del sito

Creiamo a partire dalla root del sito due cartelle che nomineremo CartellaA e CartellaB: le pagine web della prima cartella saranno accessibili solamente dagli utenti GruppoA mentre ovviamente quelle presenti nella CartellaB saranno accessibili da quelli del GruppoB.

La sicurezza
Per prima cosa dobbiamo gestire la sicurezza attraverso lo strumento di amministrazione del sito web.
All’interno del nostro ambiente di sviluppo selezioniamo le voci WebSite –> ASP.NET Configuration per avviare lo strumento di amministrazione del sito web.
Selezioniamo la voce Sicurezza: in quest’area è possibile definire gli Utenti, i Ruoli e le regole di accesso.
Iniziamo accedendo alla voce “Seleziona tipo di autenticazione” e selezioniamo la voce “da internet”.
Dopo aver premuto il tasto “Chiudi” creiamo un nuovo ruolo, anzi ne creiamo due: GruppoA e GruppoB.
Tramite il tasto “Indietro” ritorniamo nella schermata precedente e creiamo un po’ di utenti: innanzitutto dobbiamo ricordarci le userID e le password inserite ed inoltre dobbiamo associare gli utenti creati o al gruppoA o al gruppoB.

Abbiamo quindi creato i ruoli e gli utenti e quindi non resta che creare le regole di accesso selezionando la voce “crea regole di accesso“.

Nella nuova schermata possiamo vedere sulla sinistra  un  struttura ad albero del nostro sito. Selezioniamo la cartella radice (con il nome della nostra applicazione), le voci “utenti anonimi” e “nega” e confermiamo. In questo modo impediamo l’accesso al sito agli utenti non autenticati.
Poi successivamente selezioniamo ancora la cartella radice, selezioniamo nella combo la dicitura “GruppoA” e la voce “consenti” e confermiamo.
Ripetiamo quest’ultima operazione per il GruppoB. In questo modo consentiamo agli utenti del GruppoA e GruppoB di accedere alle pagine presenti nella root dell’applicazione web.

Ora selezioniamo nella struttura ad albero a sinistra la CartellaA. Nella combo Ruolo selezioniamo la voce “GruppoB” e poi anche “nega“.
Dopo aver confermato selezioniamo nella struttura ad albero a sinistra la CartellaB, nella combo Ruolo selezioniamo la voce “GruppoA” e poi “nega“.

Quindi in questo modo neghiamo l’accesso alle pagine web della cartellaA agli  utenti del GruppoB e viceversa per la CartellaB.

L’Autenticazione
A questo punto è necessario creare la videata di Login.
Creiamo nella root un nuovo webform che chiameremo login.aspx. All’interno di questa pagina trasciniamo dalla toolbox l’oggetto login.
Fondamentalmente, a parte i belletti vari da apportare successivamente, in questa pagina c’è tutto quello che ci serve.

Nel web.config della root dell’applicazione all’interno della sezione <system.web> assicuriamoci che ci siano le seguenti indicazioni
 
 <authentication mode=”Forms”>
  <forms loginUrl=”login.aspx”></forms>
 </authentication>
    <authorization>
        <deny users=”?” />
        <allow roles=”GruppoA” />
        <allow roles=”GruppoB”/>
    </authorization>

In questo modo obblighiamo ogni utente che acceda al nostro sito a passare prima dalla pagina di autenticazione.
Se infatti lanciamo l’applicazione e proviamo a visualizzare la pagina default.aspx automaticamente l’utente è dirottato sulla pagina di login.aspx.

Sitemap e menu

Creiamo una masterpage nella root dell’applicazione.
All’interno della CartellaA inseriamo  una nuova webform che chiameremo paginaA.aspx facendo molta attenzione che al momento della creazione sia selezionata la voce “Select Masterpage” ed ovviamente selezioniamo la masterpage appena creata.
Ripetiamo all’interno della CartellaB la creazione di  una nuova webform che chiameremo paginaB.aspx facendo sempre molta attenzione che al momento della creazione sia selezionata la voce “Select Masterpage“.

Aggiungiamo al nostro progetto una SiteMap. Selezioniamo nell’explorer di Visual Studio la root del progetto ed aggiungiamo un nuovo elemento.
Selezioniamo tra le varie proposte una Mappa del sito e lasciamo invariato il nome del file che ci viene proposto.

Nel file XML aperto dobbiamo inserire le informazioni nei siteMapNode.

<?xml version=”1.0″ encoding=”utf-8″ ?>
<siteMap xmlns=”http://schemas.microsoft.com/AspNet/SiteMap-File-1.0” >
    <siteMapNode url=”” title=””  description=””>
      <siteMapNode url=”~/CartellaA/PaginaA.aspx” title=”Pagina A” description=”pagina A” />
      <siteMapNode url=”~/CartellaB/PaginaB.aspx” title=”Pagina B” description=”pagina B” />   
    </siteMapNode>
</siteMap>

 
Ritorniamo alla Masterpage e trasciniamo al suo interno un oggetto TreeView. Per questo oggetto selezioniamo come tipo di origine dati una sitemap. Attenzione: posizioniamo l’oggetto Treeview fuori dal contentplaceholder della masterpage.

Proviamo a lanciare il progetto cercando di visualizzare la paginaA.aspx.
Per prima cosa viene proposta la pagina del login. Inseriamo  i dati di una utenza del gruppoA. Se i dati inseriti sono corretti verremo dirottati sulla paginaA.aspx e vedremo il nostro treeview con due rami Pagina A e Pagina B.
Se proviamo a cliccare su Pagina B automaticamente ci viene riproposto il login. Questo succede perchè abbiamo usato le credenziali di un utente del gruppo A e quindi viene  impedito l’accesso ad una pagina residente nella cartella B.
Analogamente se usiamo le credenziali di un utente del gruppo B riusciremo ad accedere alla paginaB.aspx e verrà proposto invece il login quando tenteremo di accedere alla paginaA.aspx.

Ma perchè proporre sul nostro albero del menu delle pagine a cui gli utenti non possono accedere?
Per mostrare ad ogni utente quindi un menu personalizzato in funzione del proprio ruolo ecco il supporto del “security trimming“.
Modifichiamo il nostro file web.Sitemap nel seguente modo:

<?xml version=”1.0″ encoding=”utf-8″ ?>
<siteMap xmlns=”http://schemas.microsoft.com/AspNet/SiteMap-File-1.0” >
    <siteMapNode url=”” title=””  description=”” roles=”*”>
      <siteMapNode url=”~/CartellaA/PaginaA.aspx” title=”Pagina A” description=”pagina A” roles=”GruppoA”  />
      <siteMapNode url=”~/CartellaB/PaginaB.aspx” title=”Pagina B” description=”pagina B”  roles=”GruppoB”  />   
    </siteMapNode>
</siteMap>

Come potete notare abbiamo definito in ciascun nodo del nostro menu i ruoli che possono accedere al link (roles=”*” significa tutti e bisogna per forza definirlo sul nodo radice altrimenti non verrà visualizzato il TreeView nelle pagine).

Inoltre per attivare il security trimming è necessario aggiungere al file web.config dell’applicazione la seguente porzione di codice

    <siteMap defaultProvider=”XmlSiteMapProvider” enabled=”true”>
      <providers>
        <add name=”XmlSiteMapProvider”
              description=”Default SiteMap provider”
              type=”System.Web.XmlSiteMapProvider”
             siteMapFile=”Web.sitemap”
            securityTrimmingEnabled=”true” />
      </providers>
    </siteMap>
 
 all’interno del nodo <system.web></system.web>.
 
 In questo modo se accediamo nell’applicazione come utente del GruppoA vedremo nel menu solamente i link delle pagine web abilitate  per gli utenti del gruppo. Le pagine a cui non è abilitato l’accesso non verranno visualizzate.

Maggio: 2024
L M M G V S D
 12345
6789101112
13141516171819
20212223242526
2728293031