In questa paginaObiettiviIl modulo consente di: | • | Creare un'applicazione Web che utilizza l'autenticazione basata su moduli e inserisce in un oggetto GenericPrincipal l'identità e i ruoli dell'utente autenticato allo scopo di eseguire l'autorizzazione .NET basata sui ruoli. |
Ambito di applicazioneLe informazioni contenute in questo modulo sono valide per i seguenti prodotti e tecnologie: | • | Microsoft Windows® XP o Windows 2000 Server con Service Pack 3 e sistemi operativi successivi | | • | Microsoft .NET Framework versione 1.0 con Service Pack 2 e versioni successive | | • | Microsoft Visual Studio® 1.0 .NET e versioni successive | | • | Microsoft Visual C#® .NET |
Utilizzo del moduloPer trarre il massimo vantaggio dal modulo: | • | È necessario aver acquisito esperienza nella programmazione mediante l'utilizzo di Visual C# .NET e Visual Studio .NET. | | • | È necessario aver acquisito esperienza nell'utilizzo dell'ambiente di sviluppo Visual Studio .NET. | | • | È necessario aver acquisito esperienza nello sviluppo di applicazioni Web mediante l'utilizzo di ASP.NET. | | • | Leggere il modulo 3 "Autenticazione e autorizzazione". Vi sono incluse un'introduzione alla protezione . NET basata sui ruoli e una trattazione dell'oggetto GenericPrincipal. | | • | Leggere il modulo 8 "Protezione di ASP.NET". Include una trattazione esaustiva dell'oggetto GenericPrincipal e dell'utilizzo della protezione .NET basata sui ruoli nelle applicazioni Web ASP.NET. | | • | Leggere "Procedura - Utilizzo dell'autenticazione basata su moduli mediante Active Directory". Vengono riportate informazioni dettagliate su come ottenere le informazioni dell'account utente da Active Directory. | | • | Leggere "Procedura - Utilizzo dell'autenticazione basata su moduli mediante SQL Server 2000". Include informazioni dettagliate sulla modalità di utilizzo di SQL Server 2000 come database di account utente. |
RiepilogoPer poter utilizzare in un'applicazione Web la protezione Microsoft® .NET basata sui ruoli quando si utilizza un meccanismo personalizzato di autenticazione non basato sugli account di Windows, è necessario assumersi direttamente la responsabilità di creare i ticket di autenticazione ASP.NET e di configurare le istanze di IPrincipal, che rappresentano le identità e i ruoli degli utenti autenticati. In questo modulo viene descritto come creare un'applicazione Web che utilizza l'autenticazione basata su moduli per autenticare gli utenti, nonché come creare un ticket di autenticazione contenente le informazioni sull'utente e sui ruoli. Vi è inoltre descritto come associare tali informazioni agli oggetti GenericPrincipal e FormsIdentity, consentendone l'utilizzo per la logica di autorizzazione all'interno dell'applicazione. Conoscenze necessarieLe applicazioni che utilizzano l'autenticazione basata su moduli richiedono spesso l'utilizzo della classe GenericPrincipal in combinazione con la classe FormsIdentity per creare uno schema di autorizzazione specifico non Windows, indipendente da un dominio di Windows. Ad esempio, un'applicazione può: | • | Utilizzare l'autenticazione basata su moduli per ottenere le credenziali utente (nome utente e password). | | • | Convalidare le credenziali specificate rispetto a un archivio dati, ad esempio un database o il servizio Microsoft Active Directory®. | | • | Creare gli oggetti GenericPrincipal e FormsIdentity in base ai valori recuperati dall'archivio dati, tra cui possono essere inclusi i dettagli sui ruoli dell'utente. | | • | Utilizzare questi oggetti per decisioni relative alle autorizzazioni. |
In questo modulo viene descritto come creare un'applicazione Web basata su moduli che autentica gli utenti e crea un ticket personalizzato di autenticazione basata su moduli, contenente le informazioni sull'utente e sui ruoli. Viene inoltre illustrato come associare queste informazioni agli oggetti GenericPrincipal e FormsIdentity e come associare i nuovi oggetti al contesto delle richieste Web HTTP, consentendone l'utilizzo per la logica di autorizzazione all'interno dell'applicazione. In questo modulo viene descritta in dettaglio la creazione degli oggetti GenericPrincipal e FormsIdentity insieme all'elaborazione del ticket di autenticazione basata su moduli. Per informazioni dettagliate sull'autenticazione degli utenti in Active Directory e SQL Server 2000, vedere i seguenti moduli correlati di questa guida: Creazione di un'applicazione Web con una pagina di accessoQuesta procedura consente di creare una nuova applicazione Web ASP.NET. L'applicazione includerà due pagine, ovvero una pagina predefinita alla quale possono accedere solo gli utenti autenticati e una pagina di accesso utilizzata per raccogliere le credenziali degli utenti. | • | Per creare un'applicazione Web con una pagina di accesso 1. | Avviare Visual Studio .NET e creare una nuova applicazione Web ASP.NET Visual C# denominata GenericPrincipalApp. | 2. | Rinominare WebForm1.aspx come Logon.aspx. | 3. | Aggiungere i controlli riportati di seguito a Logon.aspx per creare un modulo di accesso. Tabella 1: Controlli di Logon.aspx Etichetta | Nome utente: | - | Etichetta | Password | - | Casella di testo | - | txtUserName | Casella di testo | - | txtPassword | Pulsante | Accedi | btnLogon |
| 4. | Impostare la proprietà TextMode del controllo Casella di testo della password su Password. | 5. | In Esplora soluzioni fare clic con il pulsante destro del mouse su GenericPrincipalApp, selezionare Aggiungi, quindi fare clic su Aggiungi Web Form. | 6. | Immettere default.aspx come nome del nuovo modulo, quindi fare clic su Apri. |
|
Configurazione dell'applicazione Web per l'autenticazione basata su moduli| • | Per modificare il file web.config dell'applicazione in modo da configurare quest'ultima per l'autenticazione basata su moduli 1. | Utilizzare Esplora soluzioni per aprire il file web.config. | 2. | Individuare l'elemento <authentication> e modificare l'attributo mode impostandolo su Forms. | 3. | Aggiungere l'elemento <forms> che segue come figlio dell'elemento <authentication> e impostare gli attributi loginUrl, name, timeout e path nel modo seguente:
<authentication mode="Forms">
<forms loginUrl="logon.aspx" name="AuthCookie" timeout="60" path="/">
</forms>
</authentication>
| 4. | Aggiungere l'elemento <authorization> riportato di seguito sotto l'elemento <authentication>. In questo modo, l'accesso all'applicazione verrà consentito solo agli utenti autenticati. L'attributo loginUrl dell'elemento <authentication>, definito in precedenza, reindirizza le richieste non autenticate alla pagina Logon.aspx.
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
|
|
Generazione di un ticket di autenticazione per gli utenti autenticatiQuesta procedura consente di scrivere il codice per generare un ticket di autenticazione per gli utenti autenticati. Il ticket di autenticazione è un tipo di cookie utilizzato da FormsAuthenticationModule ASP.NET. Il codice di autenticazione consente generalmente di cercare il nome utente e la password specificati in un database personalizzato o in Active Directory. Per informazioni sull'esecuzione di queste ricerche, vedere i seguenti moduli di questa guida: | • | Per generare un ticket di autenticazione per gli utenti autenticati 1. | Aprire il file Logon.aspx.cs e aggiungere l'istruzione using riportata di seguito all'inizio del file, sotto le istruzioni using esistenti.
using System.Web.Security;
| 2. | Aggiungere il metodo dell'helper privato riportato di seguito alla classe WebForm1 denominata IsAuthenticated, utilizzata per convalidare i nomi utente e le password durante l'autenticazione degli utenti. Per questo codice viene presupposto che siano valide tutte le combinazioni di nome utente e password.
private bool IsAuthenticated( string username, string password )
{
// Lookup code omitted for clarity
// This code would typically validate the user name and password
// combination against a SQL database or Active Directory
// Simulate an authenticated user
return true;
}
| 3. | Aggiungere il metodo dell'helper privato denominato GetRoles riportato di seguito, utilizzato per ottenere l'insieme dei ruoli dell'utente.
private string GetRoles( string username, string password )
{
// Lookup code omitted for clarity
// This code would typically look up the role list from a
database table.
// If the user was being authenticated against Active Directory, the
// Security groups and/or distribution lists that the user
belongs to may be
// used instead
// This GetRoles method returns a pipe delimited string containing
roles
// rather than returning an array, because the string format is
convenient
// for storing in the authentication ticket / cookie, as user data
return "Senior Manager|Manager|Employee";
}
| 4. | Visualizzare il modulo Logon.aspx in modalità progettazione, quindi fare doppio clic sul pulsante Accedi per creare un gestore eventi Click. | 5. | Aggiungere una chiamata al metodo IsAuthenticated, specificando il nome utente e la password acquisiti tramite il modulo di accesso. Assegnare il valore restituito a una variabile di tipo bool, che indica se l'utente è autenticato o meno.
bool isAuthenticated = IsAuthenticated( txtUserName.Text,
txtPassword.Text );
| 6. | Se l'utente è autenticato, aggiungere una chiamata al metodo GetRoles per ottenere l'elenco dei ruoli dell'utente.
if (isAuthenticated == true )
{
string roles = GetRoles( txtUserName.Text, txtPassword.Text );
| 7. | Creare un nuovo ticket di autenticazione basata su moduli contenente il nome utente, la data di scadenza e l'elenco dei ruoli dell'utente. Si noti che la proprietà User data del ticket di autenticazione viene utilizzata per archiviare l'elenco dei ruoli dell'utente. Osservare inoltre che il codice riportato di seguito consente di creare un ticket non permanente, anche se il fatto che il ticket o cookie sia permanente o meno dipende dallo scenario dell'applicazione specifica.
// Create the authentication ticket
FormsAuthenticationTicket authTicket = new
FormsAuthenticationTicket(1, // version
txtUserName.Text, // user name
DateTime.Now, // creation
DateTime.Now.AddMinutes(60),// Expiration
false, // Persistent
roles ); // User data
| 8. | Aggiungere il codice per creare una rappresentazione del ticket in formato di stringa crittografata e archiviarla come dati all'interno di un oggetto HttpCookie .
// Now encrypt the ticket.
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
// Create a cookie and add the encrypted ticket to the
// cookie as data.
HttpCookie authCookie =
new HttpCookie(FormsAuthentication.FormsCookieName,
encryptedTicket);
| 9. | Aggiungere il cookie all'insieme di cookie restituito al browser dell'utente.
// Add the cookie to the outgoing cookies collection.
Response.Cookies.Add(authCookie);
| 10. | Reindirizzare l'utente alla pagina richiesta in origine.
// Redirect the user to the originally requested page
Response.Redirect( FormsAuthentication.GetRedirectUrl(
txtUserName.Text,
false ));
}
|
|
Creazione di oggetti GenericPrincipal e FormsIdentityQuesta procedura consente di implementare un gestore eventi di autenticazione dell'applicazione e creare oggetti GenericPrincipal e FormsIdentity in base alle informazioni contenute all'interno del ticket di autenticazione. | • | Per creare oggetti GenericPrincipal e FormsIdentity 1. | Da Esplora soluzioni aprire global.asax. | 2. | Passare alla visualizzazione del codice e aggiungere all'inizio del file le seguenti istruzioni using:
using System.Web.Security;
using System.Security.Principal;
| 3. | Individuare il gestore eventi Application_AuthenticateRequest e aggiungere il codice riportato di seguito per ottenere il cookie di autenticazione basata su moduli dall'insieme di cookie passato con la richiesta.
// Extract the forms authentication cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if(null == authCookie)
{
// There is no authentication cookie.
return;
}
| 4. | Aggiungere il codice riportato di seguito per estrarre il ticket di autenticazione dal cookie di autenticazione basata su moduli e decrittografarlo.
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch(Exception ex)
{
// Log exception details (omitted for simplicity)
return;
}
if (null == authTicket)
{
// Cookie failed to decrypt.
return;
}
| 5. | Aggiungere il codice riportato di seguito per analizzare l'elenco dei nomi dei ruoli separati da barre verticali associato al ticket quando l'utente è stato autenticato in origine.
// When the ticket was created, the UserData property was assigned a
// pipe delimited string of role names.
string[] roles = authTicket.UserData.Split(new char[]{'|'});
| 6. | Aggiungere il codice riportato di seguito per creare un oggetto FormsIdentity con il nome utente ottenuto dal nome del ticket e un oggetto GenericPrincipal contenente l'identità stessa e il relativo elenco dei ruoli utente.
// Create an Identity object
FormsIdentity id = new FormsIdentity( authTicket );
// This principal will flow throughout the request.
GenericPrincipal principal = new GenericPrincipal(id, roles);
// Attach the new principal object to the current HttpContext object
Context.User = principal;
|
|
Test dell'applicazioneQuesta procedura consente di aggiungere alla pagina default.aspx il codice per visualizzare informazioni dall'oggetto GenericPrincipal associato all'oggetto HttpContext corrente, in modo da verificare che l'oggetto sia stato creato e assegnato correttamente alla richiesta Web corrente. Quindi sarà possibile generare ed eseguire il test dell'applicazione. | • | Per eseguire il test dell'applicazione 1. | In Esplora soluzioni fare doppio clic su default.aspx. | 2. | Fare doppio clic sul modulo Web default.aspx per visualizzare il gestore eventi di caricamento della pagina. | 3. | Scorrere verso l'inizio del file e aggiungere l'istruzione using riportata di seguito sotto le istruzioni using esistenti.
using System.Security.Principal;
| 4. | Tornare al gestore eventi di caricamento della pagina e aggiungere il codice riportato di seguito per visualizzare il nome di identità correlato all'oggetto GenericPrincipal associato alla richiesta Web corrente.
IPrincipal p = HttpContext.Current.User;
Response.Write( "Authenticated Identity is: " +
p.Identity.Name );
Response.Write( "<p>" );
| 5. | Aggiungere il codice riportato di seguito per verificare l'appartenenza ai ruoli dell'identità autenticata corrente.
if ( p.IsInRole("Senior Manager") )
Response.Write( "User is in Senior Manager role<p>" );
else
Response.Write( "User is not in Senior Manager role<p>" );
if ( p.IsInRole("Manager") )
Response.Write( "User is in Manager role<p>" );
else
Response.Write( "User is not in Manager role<p>" );
if ( p.IsInRole("Employee") )
Response.Write( "User is in Employee role<p>" );
else
Response.Write( "User is not in Employee role<p>" );
if ( p.IsInRole("Sales") )
Response.Write( "User is in Sales role<p>" );
else
Response.Write( "User is not in Sales role<p>" );
| 6. | In Esplora soluzioni fare clic con il pulsante destro del mouse su default.aspx, quindi fare clic su Imposta come pagina iniziale. | 7. | Scegliere Genera soluzione dal menu Genera. Eliminare eventuali errori di generazione. | 8. | Premere Ctrl+F5 per eseguire l'applicazione. Poiché default.aspx è configurata come pagina iniziale, questa è la pagina richiesta inizialmente. | 9. | Quando si viene reindirizzati alla pagina di accesso poiché inizialmente non si dispone di un ticket di autenticazione, immettere un nome utente e una password qualsiasi, quindi fare clic su Accedi. | 10. | Verificare che l'utente venga reindirizzato alla pagina default.aspx e che vengano visualizzati l'identità dell'utente e i dettagli corretti relativi ai ruoli. L'utente deve risultare un membro dei ruoli Senior Manager, Manager ed Employee ma non del ruolo Sales. |
|
Altre risorsePer ulteriori informazioni, vedere i seguenti moduli correlati di questa guida:
| |