Appartenenze

di Microsoft

Nota

Poiché questo articolo è stato scritto, i provider di appartenenze ASP.NET sono stati sostituiti da ASP.NET Identity. È consigliabile aggiornare le app per usare ASP.NET Identity Platform anziché i provider di appartenenze in primo piano al momento della scrittura di questo articolo. ASP.NET Identity presenta diversi vantaggi rispetto al sistema di appartenenza ASP.NET, tra cui :

  • Prestazioni migliori
  • Miglioramento dell'estendibilità e della testability
  • Supporto per OAuth, OpenID Connect e autenticazione a due fattori
  • Supporto delle identità basate sulle attestazioni
  • Migliore interoperabilità con ASP.Net Core

ASP.NET L'appartenenza si basa sull'esito positivo del modello di autenticazione Basata su form da ASP.NET 1.x. ASP.NET l'autenticazione basata su form consente di incorporare un modulo di accesso nell'applicazione ASP.NET e convalidare gli utenti in un database o in un altro archivio dati.

ASP.NET L'appartenenza si basa sull'esito positivo del modello di autenticazione Basata su form da ASP.NET 1.x. ASP.NET l'autenticazione basata su form consente di incorporare un modulo di accesso nell'applicazione ASP.NET e convalidare gli utenti in un database o in un altro archivio dati. I membri della classe FormsAuthentication consentono di gestire i cookie per l'autenticazione, verificare la presenza di un account di accesso valido, disconnettere un utente e così via. Tuttavia, l'implementazione dell'autenticazione basata su form in un'applicazione ASP.NET 1.x può richiedere una quantità equa di codice.

L'appartenenza a ASP.NET 2.0 è un importante progresso rispetto all'uso dell'autenticazione basata su form. L'appartenenza è più affidabile quando è associata all'autenticazione basata su form, ma l'uso dell'autenticazione basata su form non è un requisito. Come si vedrà presto, è possibile usare ASP.NET Appartenenza e i controlli di accesso in ASP.NET 2.0 per implementare un sistema di appartenenza potente senza scrivere codice.

Implementazione dell'appartenenza a ASP.NET 2.0

L'appartenenza viene implementata seguendo quattro passaggi. Tenere presente che sono necessari molti passaggi secondari, nonché la configurazione facoltativa che è possibile implementare. Questi passaggi sono progettati per illustrare il quadro generale della configurazione dell'appartenenza.

  1. Creare il database di appartenenza (se SQL Server viene usato come archivio di appartenenze).

  2. Specificare le opzioni di appartenenza nei file di configurazione delle applicazioni. L'appartenenza è abilitata per impostazione predefinita.

  3. Determinare il tipo di archivio di appartenenze che si vuole usare. Sono disponibili le opzioni seguenti:

    • Microsoft SQL Server (versione 7.0 o successiva)
    • Archivio Active Directory
    • Provider di appartenenze personalizzato
  4. Configurare l'applicazione per l'autenticazione basata su ASP.NET Form. Anche in questo caso, l'appartenenza è progettata per sfruttare i vantaggi dell'autenticazione basata su form, ma l'uso dell'autenticazione basata su form non è un requisito.

  5. Definire gli account utente per l'appartenenza e configurare i ruoli, se necessario.

Creazione del database di appartenenza

Se si usa SQL Server 7.0 o versione successiva come archivio di appartenenza, è possibile usare l'utilità aspnet_regsql (disponibile più facilmente dal prompt dei comandi di Visual Studio .NET 2005) per configurare il database. L'utilità aspnet_regsql può essere usata come strumento del prompt dei comandi o tramite una procedura guidata gui. Il metodo della procedura guidata è il modo più semplice per configurare il database. Per accedere alla procedura guidata, eseguire semplicemente il comando seguente:

aspnet_regsql W

Dopo aver eseguito questo comando, verrà visualizzata l'installazione guidata di ASP.NET SQL Server, come illustrato di seguito.

Screenshot che mostra un programma di installazione guidata del server A S P dot NET S Q L.

Figura 1

L'installazione guidata di ASP.NET SQL Server crea il sito Web nell'istanza specificata nella procedura guidata. Tuttavia, ASP.NET userà la stringa di connessione nel file machine.config per connettersi al database. Per impostazione predefinita, questa stringa di connessione punterà a un'istanza di SQL Server 2005, pertanto se si usa un SQL Server 2000 o SQL Server 7.0 istanza, sarà necessario modificare la stringa di connessione nel file machine.config. La stringa di connessione può trovarsi qui:

<configuration>
    <connectionStrings>
      <add name="LocalSqlServer"
         connectionString="data source=(local);
         Integrated Security=SSPI;Initial Catalog=aspnetdb;"  
         providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>

Sfortunatamente, se non si modifica la stringa di connessione, ASP.NET non restituirà un errore descrittivo. Continuerà a lamentarsi dicendo che non è stato creato il database. Nel caso precedente, la stringa di connessione è stata modificata in modo che punti all'istanza locale SQL Server 2000.

Specifica della configurazione e dell'aggiunta di utenti e ruoli

Il passaggio successivo nella configurazione dell'appartenenza consiste nell'aggiungere le informazioni necessarie al file web.config dell'applicazione. In ASP.NET 1.x, la modifica del file web.config era talvolta difficile a causa dell'uso di lowerCamelCase e della mancanza di IntelliSense. Visual Studio .NET 2005 semplifica notevolmente l'attività con IntelliSense per i file di configurazione, ma ASP.NET 2.0 è un ulteriore passaggio fornendo un'interfaccia Web per la modifica dei file di configurazione.

È possibile avviare l'interfaccia Web facendo clic sul pulsante Configurazione ASP.NET sulla barra degli strumenti Esplora soluzioni, come illustrato di seguito. È anche possibile avviare l'interfaccia Web tramite popup che vengono visualizzati quando vengono inseriti i controlli di accesso.

Screenshot che mostra una barra degli strumenti Esplora soluzioni con web.config selezionato.

Figura 2

Verrà avviato lo strumento di amministrazione del sito Web ASP.NET illustrato di seguito. L'ASP.NET Amministrazione sito Web è un'interfaccia a quattro schede che semplifica la gestione delle impostazioni dell'applicazione. Sono disponibili le schede seguenti:

  • Casa
  • Sicurezza Configurare utenti, ruoli e accesso.
  • Applicazione Configurare le impostazioni dell'applicazione.
  • Provider Configurare e testare il provider di appartenenze alle applicazioni.

Lo strumento di amministrazione del sito Web consente di creare facilmente nuovi utenti, creare nuovi ruoli e gestire utenti e ruoli. Questa funzionalità non è disponibile nell'interfaccia di Windows. L'interfaccia di Windows consente di definire facilmente le impostazioni di autorizzazione e di aggiungere, eliminare e gestire provider, funzionalità che non si trovano nello strumento di amministrazione del sito Web.

Per avviare l'interfaccia di Windows, aprire lo snap-in Internet Information Services, fare clic con il pulsante destro del mouse sull'applicazione e scegliere Proprietà. Fare clic sulla scheda ASP.NET e quindi sul pulsante Modifica configurazione. L'applicazione deve essere in esecuzione in ASP.NET 2.0 per abilitare il pulsante Modifica configurazione. È anche possibile configurare la versione ASP.NET nella finestra di dialogo ASP.NET. La finestra di dialogo impostazioni di configurazione ASP.NET viene visualizzata come illustrato di seguito.

Screenshot che mostra una scheda Generale nella finestra di dialogo Impostazioni di configurazione A S P punto N E T.

Figura 3

Nella scheda Generale sono elencate le stringhe di connessione e le impostazioni dell'applicazione. Tutte le impostazioni in corsivo sono definite in un file di configurazione padre (il machine.config o un web.config a un livello superiore) e le impostazioni non in corsivo provengono dal file di configurazione delle applicazioni. Se a livello di applicazione viene aggiunta, rimossa o modificata un'impostazione a livello di applicazione, ASP.NET aggiunge, rimuove o modifica l'impostazione a livello di applicazione web.config anziché rimuovere l'impostazione dal file di configurazione da cui viene ereditata.

La scheda Autenticazione è illustrata di seguito. Qui è possibile configurare le impostazioni di appartenenza. Le impostazioni di autenticazione basata su form, i provider di appartenenze e i provider di ruoli possono essere configurati qui.

Screenshot che mostra una scheda Autenticazione nella finestra di dialogo Configurazioni A S P punto N E T.

Figura 4

Implementazione dell'appartenenza all'applicazione

Il modo più semplice per implementare ASP.NET 2.0 appartenenza all'applicazione consiste nell'usare i controlli di accesso forniti. Questo metodo consente di implementare le nozioni di base dell'appartenenza ASP.NET 2.0 senza scrivere codice.

I controlli di accesso seguenti sono disponibili in ASP.NET 2.0:

Controllo di accesso

Il controllo Login fornisce un'interfaccia per consentire a un utente di accedere al sistema di appartenenza. Fornisce una casella di testo nome utente e password e un pulsante di accesso. Molte altre funzionalità comuni, ad esempio un collegamento per la registrazione per le persone che non hanno ancora fatto, una casella di controllo che consente all'utente di accedere automaticamente alle visite successive, un collegamento per un promemoria della password e così via. Tutte le funzionalità del controllo Login sono personalizzabili tramite le proprietà del controllo .

In ASP.NET 1.x, gli sviluppatori hanno dovuto scrivere una quantità equa di codice per eseguire una ricerca quando si usa l'autenticazione basata su form. Con ASP.NET appartenenza 2.0, è possibile convalidare gli utenti senza scrivere codice. ASP.NET eseguirà automaticamente la ricerca dell'utente. Se si usa il controllo Login senza usare ASP.NET appartenenza, è possibile usare il metodo OnAuthenticate per convalidare l'utente.

Controllo LoginView

Il controllo LoginView è un controllo basato su modelli che fornisce due modelli per impostazione predefinita; AnonymousTemplate e LoggedInTemplate. Il modello visualizzato è determinato dal fatto che l'utente sia connesso o meno al sistema di appartenenza. Questo controllo viene in genere usato per visualizzare un controllo Login quando un utente non ha ancora eseguito l'accesso e un controllo LoginStatus e/o altri controlli di accesso quando l'utente ha eseguito l'accesso. Se si usa la gestione dei ruoli nell'applicazione ASP.NET, il controllo LoginView può visualizzare un modello specifico in base al ruolo degli utenti. Altre informazioni sulla gestione dei ruoli ASP.NET verranno trattate più avanti.

Controllo PasswordRecovery

Il controllo PasswordRecovery consente agli utenti di ricevere un messaggio di posta elettronica con la password corrente o reimpostare la password. Le password crittografate e non crittografate possono essere recuperate e inoltrate tramite posta elettronica agli utenti. Se la password è hash, non può essere recuperata. Sarà invece necessario che l'utente esegua una reimpostazione della password.

Controllo LoginStatus

Il controllo LoginStatus viene usato per visualizzare un indicatore di accesso per gli utenti che non hanno eseguito l'accesso e un indicatore di disconnessione agli utenti attualmente connessi. La proprietà Request.IsAuthenticated viene utilizzata per determinare l'indicatore da visualizzare. L'indicatore visualizzato dal controllo LoginStatus può essere testo (implementato tramite le proprietà LoginText e LogoutText ) o immagini (implementate tramite le proprietà LoginImageUrl e LogoutImageUrl ).

Quando un utente esegue la disconnessione tramite il controllo LoginStatus, viene reindirizzato all'URL specificato dalla proprietà LogoutPageUrl . Se tale proprietà non è impostata, la pagina corrente viene aggiornata. Poiché il sito è probabilmente protetto dall'autenticazione basata su form, l'aggiornamento della pagina corrente reindirizzerà l'utente alla pagina di accesso per il sito.

Controllo LoginName

Il controllo LoginName visualizza il nome utente dell'utente attualmente connesso al sito.

CreateUserWizard Control

Il controllo CreateUserWizard offre agli utenti un modo pratico per registrarsi per il sistema di appartenenza. È possibile aggiungere passaggi (implementati come raccolta di WizardSteps) tramite l'interfaccia illustrata di seguito.

Screenshot che mostra una finestra di dialogo Crea attività creazione guidata utente con un menu a discesa per iscriversi al nuovo account.

Figura 5

CreateUserWizard è un controllo basato su modelli che deriva dalla classe Wizard e fornisce i modelli seguenti:

  • Headertemplate Questo modello controlla l'aspetto dell'intestazione della procedura guidata.
  • SidebarTemplate Questo modello controlla l'aspetto della barra laterale della procedura guidata.
  • StartNavigationTemplate Questo modello controlla l'aspetto della navigazione nella procedura guidata al passaggio iniziale.
  • Stepnavigationtemplate Questo modello controlla l'aspetto dell'area di spostamento quando non è presente nel passaggio di inizio o fine.
  • FinishNavigationTemplate Questo modello controlla l'aspetto dell'area di spostamento al termine del passaggio.

Inoltre, per ogni passaggio aggiunto alla procedura guidata, ASP.NET creerà un modello personalizzato contenente sia ContentTemplate che CustomNavigationTemplate per tale passaggio. Per informazioni dettagliate sulla personalizzazione di CreateUserWizard, vedere la documentazione di VS.NET 2005:

Controllo ChangePassword

Il controllo ChangePassword consente agli utenti di modificare la password. Se la proprietà DisplayUserName è true (per impostazione predefinita è false), l'utente può modificare la password quando non è connesso. Se l'utente ha già effettuato l'accesso e la proprietà DisplayUserName è true, l'utente potrà modificare la password di un altro utente che non ha eseguito l'accesso, specificando che conosce l'ID utente dell'utente.

Tenere presente che se si vuole che gli utenti possano modificare le password senza dover accedere, è necessario assicurarsi che la pagina in cui viene visualizzato il controllo ChangePassword consenta l'accesso anonimo. Ovviamente, gli utenti dovranno fornire la vecchia password per modificare la password.

Gestione dei ruoli

La gestione dei ruoli consente di assegnare utenti a un ruolo specifico e quindi limitare l'accesso a determinati file o cartelle in base a tale ruolo. La gestione dei ruoli fornisce anche un'API in modo che sia possibile determinare a livello di codice un ruolo o determinare tutti gli utenti in un ruolo specifico e rispondere di conseguenza.

La gestione dei ruoli non è un requisito nell'appartenenza ASP.NET, né è un requisito di appartenenza per usare la gestione dei ruoli. Tuttavia, i due integratori l'uno l'altro bene e è probabile che gli sviluppatori li useranno in combinazione tra loro.

Per abilitare la gestione dei ruoli nell'applicazione, apportare le modifiche seguenti nel file di web.config:

<roleManager enabled="true" cacheRolesInCookie="true" cookieProtection="All" />

Quando l'attributo cacheRolesInCookie è impostato su true, ASP.NET memorizza nella cache un'appartenenza a un ruolo utente in un cookie nel client. In questo modo le ricerche dei ruoli vengono eseguite senza chiamate in RoleProvider. Quando si usa questo attributo, gli sviluppatori sono invitati a garantire che l'attributo cookieProtection sia impostato su All. Questa è l'impostazione predefinita. Ciò garantisce che i dati dei cookie siano crittografati e consentano di garantire che il contenuto dei cookie non sia stato modificato. I ruoli possono essere aggiunti usando lo strumento di amministrazione del sito Web. Consente di definire facilmente i ruoli, configurare l'accesso a parti del sito in base a tali ruoli e assegnare utenti ai ruoli.

Screenshot che mostra uno strumento di amministrazione del sito Web A S P punto N E T con il pulsante Aggiungi ruolo.

Figura 6

Come illustrato in precedenza, è possibile aggiungere nuovi ruoli immettendo semplicemente il nome del ruolo e quindi facendo clic su Aggiungi ruolo. I ruoli esistenti possono essere gestiti o eliminati facendo clic sul collegamento appropriato nell'elenco dei ruoli esistenti.

Quando si gestisce un ruolo, è possibile aggiungere o rimuovere utenti, come illustrato di seguito.

Screenshot che mostra uno strumento di amministrazione sito Web A P punto N E T con il pulsante Trova utente.

Figura 7

Selezionando la casella di controllo User Is In Role (Utente in ruolo) è possibile aggiungere facilmente un utente a un ruolo specifico. ASP.NET aggiornerà automaticamente il database di appartenenza con le voci appropriate. È anche necessario configurare le regole di accesso per l'applicazione. ASP.NET sviluppatori 1.x hanno familiarità con questa operazione tramite l'elemento <di autorizzazione> nel file web.config e tale opzione è ancora disponibile in ASP.NET 2.0. Tuttavia, è più semplice gestire le regole di accesso usando lo strumento di amministrazione del sito Web, come illustrato di seguito.

Screenshot che mostra lo strumento Amministrazione sito Web A S P punto N E T con gli elementi selezionati in Utenti e ruoli.

Figura 8

In questo caso, la cartella Amministrazione è evidenziata (difficile da vedere perché lo strumento lo evidenzia in grigio chiaro) e al ruolo Administrators è stato concesso l'accesso. Tutti gli altri utenti vengono negati. È possibile fare clic sull'icona della testa per selezionare una regola e quindi usare i pulsanti Sposta su e Sposta giù per disporre le regole. Come per l'elemento di <autorizzazione> ASP.NET, le regole vengono elaborate nell'ordine in cui vengono visualizzate. In altre parole, se l'ordine delle regole nell'immagine precedente fosse invertito, nessuno avrebbe accesso alla cartella Amministrazione perché la prima regola che ASP.NET sarebbe la regola che nega tutti alla cartella.

ASP.NET 2.0 aggiunge un file web.config alla cartella per cui si specifica una regola di accesso. Le regole di accesso possono essere modificate tramite il file di configurazione o tramite lo strumento di amministrazione del sito Web. In altre parole, lo strumento di amministrazione del sito Web è semplicemente un'interfaccia tramite cui il file di configurazione può essere modificato in un ambiente intuitivo.

Uso dei ruoli nel codice

L'API per la gestione dei ruoli non è stata modificata dalla versione 1.x. Il metodo IsInRole viene utilizzato per determinare se un utente si trova in un determinato ruolo.

if (User.IsInRole(Administrators)) {
    btnManageSite.Visible = true;
}

ASP.NET crea anche un'istanza RolePrincipal come membro del contesto corrente. L'oggetto RolePrincipal può essere utilizzato per ottenere tutti i ruoli a cui appartiene l'utente come indicato di seguito:

string[] userRoles = ((RolePrincipal)User).GetRoles();

Uso di RoleGroups con il controllo LoginView

Ora che si ha una conoscenza della gestione dei ruoli e dell'appartenenza, è possibile illustrare brevemente come il controllo LoginView sfrutta questa funzionalità in ASP.NET 2.0. Come illustrato in precedenza, il controllo LoginView è un controllo basato su modelli che contiene due modelli per impostazione predefinita; AnonymousTemplate e LoggedInTemplate. Nella finestra di dialogo LoginView Tasks è presente un collegamento (illustrato di seguito) che consente di modificare RoleGroups.

Screenshot che mostra il controllo Visualizzazione accesso nella finestra di dialogo Login View Tasks con un elenco a discesa e un gruppo di ruoli selezionato.

Figura 9

Ogni oggetto RoleGroup contiene una matrice di stringhe che definisce i ruoli a cui si applica RoleGroup. Per aggiungere un nuovo RoleGroup al controllo LoginView, fare clic sul collegamento Modifica gruppi di ruoli. Nell'immagine precedente è possibile notare che è stato aggiunto un nuovo RoleGroup per amministratori. Selezionando tale gruppo di ruoli (RoleGroup[0]) dall'elenco a discesa Visualizzazioni, è possibile configurare un modello che verrà visualizzato solo ai membri del ruolo Amministratori. Nell'immagine seguente è stato aggiunto un nuovo RoleGroup che si applica ai membri del ruolo Sales e del ruolo Distribuzione. Verrà aggiunto un secondo RoleGroup all'elenco a discesa Visualizzazioni nella finestra di dialogo Attività loginView e qualsiasi elemento aggiunto a tale modello sarà visibile da qualsiasi utente nel ruolo Sales o Distribution.

Screenshot che mostra una finestra di dialogo Editor raccolta gruppi di ruoli con un elenco a discesa che seleziona Amministratori.

Figura 10

Override del provider di appartenenze esistente

Esistono due modi per estendere la funzionalità dell'appartenenza ASP.NET. Prima di tutto, è ovviamente possibile modificare la funzionalità esistente della classe SqlMembershipProvider ereditando da esso ed eseguendo l'override dei relativi metodi. Ad esempio, se si vuole implementare funzionalità personalizzate quando vengono creati gli utenti, è possibile creare una classe personalizzata che eredita da SqlMembershipProvider come indicato di seguito:

public class jForumMembershipProvider : SqlMembershipProvider {
    public jForumMembershipProvider() {

    }
    public override MembershipUser CreateUser(
    string username,
    string password,
    string email,
    string passwordQuestion,
    string passwordAnswer,
    bool isApproved,
    object providerUserKey,
    out MembershipCreateStatus status) {
        // your own implementation
        return base.CreateUser(
        username,
        password,
        email,
        passwordQuestion,
        passwordAnswer,
        isApproved,
        providerUserKey,
        out status);
    }
}

Se, d'altra parte, si vuole creare un provider personalizzato (per archiviare le informazioni di appartenenza in un database di Access, ad esempio), è possibile creare un provider personalizzato.

Creazione di un provider di appartenenze personalizzato

Per creare un provider di appartenenze personalizzato, è prima necessario creare una classe che eredita dalla classe MembershipProvider. Se si usa VB.NET, Visual Studio 2005 aggiungerà gli stub per tutti i metodi di cui è necessario eseguire l'override. Se si usa C#, è possibile aggiungere gli stub.

Sarà necessario eseguire l'override di quanto segue:

  • Proprietà ApplicationName
  • Funzione ChangePassword
  • Funzione ChangePasswordQuestionAndAnswer
  • Funzione CreateUser
  • Funzione DeleteUser
  • EnablePasswordReset, proprietà
  • EnablePasswordRetrieval, proprietà
  • Funzione FindUsersByEmail
  • Funzione FindUsersByName
  • Funzione GetAllUsers
  • Funzione GetNumberOfUsersOnline
  • Funzione GetPassword
  • Funzione GetUser
  • Funzione GetUserNameByEmail
  • Proprietà MaxInvalidPasswordAttempts
  • Proprietà MinRequiredNonAlphanumericCharacters
  • MinRequiredPasswordLength, proprietà
  • PasswordAttemptWindow, proprietà
  • PasswordFormat, proprietà
  • PasswordStrengthRegularExpression, proprietà
  • RequiresQuestionAndAnswer, proprietà
  • RichiedeUniqueEmail, proprietà
  • Funzione ResetPassword
  • Sbloccare la funzione utente
  • Funzione UpdateUser
  • Funzione ValidateUser

Che rappresenta un elenco da implementare come sviluppatore C#. È possibile che sia più facile creare la classe in VB.NET senza alcuna implementazione e quindi usare .NET Reflectionor o uno strumento simile per convertire il codice in C#.

La stringa di connessione e altre proprietà devono essere impostate sulle impostazioni predefinite nel metodo Initialize. Il metodo Initialize viene attivato quando il provider viene caricato in fase di esecuzione. Il secondo parametro del metodo Initialize è di tipo System.Collections.Specialized.NameValueCollection ed è un riferimento all'elemento <add> associato al provider personalizzato nel file web.config. Questa voce è simile alla seguente:

<system.web>
  <authentication mode="Forms"/>
  <membership
  defaultProvider="jForumCustomMembershipProvider" >
    <providers>
      <add name="jForumCustomMembershipProvider"
      type="jForumCustomMembershipProvider"
      requiresQuestionAndAnswer="true"
      connectionString="Provider=Microsoft.Jet.
        OLEDB.4.0;Data Source=C:\jForumCustomMembershipProvider\
        App_Data\Members.mdb;Persist Security
        Info=False"
        />
    </providers>
  </membership>
</system.web>

Ecco un esempio del metodo Initialize.

public override void Initialize(string name,
    System.Collections.Specialized.NameValueCollection config) {

    if (config["requiresQuestionAndAnswer"])
        _requiresQuestionAndAnswer = true;
    _connString = config["connectionString"];
    base.Initialize(name, config);
}

Per convalidare l'utente quando inviano il modulo di accesso, è necessario usare il metodo ValidateUser. Questo metodo viene generato quando l'utente fa clic sul pulsante di accesso nel controllo Login. Si inserisce il codice che esegue la ricerca dell'utente in questo metodo.

Come si può notare, la scrittura del proprio provider di appartenenza non è difficile e consente di estendere questa potente funzionalità di ASP.NET 2.0.