Condividi tramite


Configurazione di un sito Web che usa i servizi per le applicazioni (C#)

di Scott Mitchell

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 versione 2.0 ha introdotto una serie di servizi dell'applicazione, che fanno parte di .NET Framework e fungono da suite di servizi a blocchi predefiniti che è possibile usare per aggiungere funzionalità avanzate all'applicazione Web. Questa esercitazione illustra come configurare un sito Web nell'ambiente di produzione per l'uso dei servizi dell'applicazione e risolve i problemi comuni relativi alla gestione di account utente e ruoli nell'ambiente di produzione.

Introduzione

ASP.NET versione 2.0 ha introdotto una serie di servizi dell'applicazione, che fanno parte di .NET Framework e fungono da suite di servizi a blocchi predefiniti che è possibile usare per aggiungere funzionalità avanzate all'applicazione Web. I servizi dell'applicazione includono:

  • Appartenenza : API per la creazione e la gestione degli account utente.
  • Ruoli : UN'API per la categorizzazione degli utenti in gruppi.
  • Profilo : API per l'archiviazione di contenuti personalizzati specifici dell'utente.
  • Mappa del sito: UN'API per la definizione di una struttura logica del sito sotto forma di gerarchia, che può quindi essere visualizzata tramite controlli di spostamento, ad esempio menu e navigazione.
  • Personalizzazione : UN'API per mantenere le preferenze di personalizzazione, più spesso usata con WebParts.
  • Monitoraggio dell'integrità: API per il monitoraggio delle prestazioni, della sicurezza, degli errori e di altre metriche di integrità del sistema per un'applicazione Web in esecuzione.

Le API dei servizi dell'applicazione non sono associate a un'implementazione specifica. In alternativa, si indica ai servizi dell'applicazione di usare un provider specifico e tale provider implementa il servizio usando una particolare tecnologia. I provider più comunemente usati per le applicazioni Web basate su Internet ospitati in una società di hosting Web sono i provider che usano un'implementazione del database SQL Server. Ad esempio, SqlMembershipProvider è un provider per l'API di appartenenza che archivia le informazioni sull'account utente in un database di Microsoft SQL Server.

L'uso dei servizi dell'applicazione e dei provider di SQL Server comporta alcuni problemi durante la distribuzione dell'applicazione. Per iniziare, gli oggetti di database dei servizi applicazioni devono essere creati correttamente nei database di sviluppo e di produzione e inizializzati in modo appropriato. Sono inoltre necessarie impostazioni di configurazione importanti.

Nota

Le API dei servizi delle applicazioni sono state progettate usando il modello di provider, un modello di progettazione che consente di fornire i dettagli di implementazione di un'API in fase di esecuzione. .NET Framework viene fornito con diversi provider di servizi dell'applicazione che possono essere usati, ad esempio SqlMembershipProvider e SqlRoleProvider, che sono provider per le API appartenenza e ruoli che usano un'implementazione del database SQL Server. È anche possibile creare e collegare un provider personalizzato. Infatti, l'applicazione Web Book Reviews contiene già un provider personalizzato per l'API Mappa del sito (ReviewSiteMapProvider), che costruisce la mappa del sito dai dati nelle Genres tabelle e Books nel database.

Questa esercitazione inizia con un'analisi del modo in cui ho esteso l'applicazione Web Book Reviews per usare le API Appartenenza e Ruoli. Illustra quindi la distribuzione di un'applicazione Web che usa i servizi delle applicazioni con un'implementazione del database SQL Server e conclude risolvendo i problemi comuni relativi alla gestione di account utente e ruoli nell'ambiente di produzione.

Aggiornamenti all'applicazione Recensioni libro

Nelle ultime due esercitazioni l'applicazione Web Book Reviews è stata aggiornata da un sito Web statico a un'applicazione Web dinamica basata sui dati completa di un set di pagine di amministrazione per la gestione di generi e recensioni. Tuttavia, questa sezione di amministrazione non è attualmente protetta. Qualsiasi utente che conosce (o indovina) l'URL della pagina di amministrazione può creare, modificare o eliminare recensioni nel nostro sito. Un modo comune per proteggere determinate parti di un sito Web consiste nell'implementare gli account utente e quindi usare le regole di autorizzazione URL per limitare l'accesso a determinati utenti o ruoli. L'applicazione Web Book Reviews disponibile per il download con questa esercitazione supporta account utente e ruoli. Ha un singolo ruolo definito Amministrazione e solo gli utenti di questo ruolo possono accedere alle pagine di amministrazione.

Nota

Ho creato tre account utente nell'applicazione Web Book Reviews: Scott, Jisun e Alice. Tutti e tre gli utenti hanno la stessa password: password! Scott e Jisun sono nel ruolo Amministrazione, Alice non è. Le pagine di non amministrazione del sito sono ancora accessibili agli utenti anonimi. Ciò significa che non è necessario accedere per visitare il sito, a meno che non si voglia amministrarlo, nel qual caso è necessario accedere come utente nel ruolo di Amministrazione.

La pagina master dell'applicazione Book Reviews è stata aggiornata in modo da includere un'interfaccia utente diversa per gli utenti autenticati e anonimi. Se un utente anonimo visita il sito in cui viene visualizzato un collegamento Di accesso nell'angolo in alto a destra. Un utente autenticato visualizza il messaggio "Benvenuti, nome utente!" e un collegamento per disconnettersi. È disponibile anche una pagina di accesso (~/Login.aspx), che contiene un controllo Web di accesso che fornisce l'interfaccia utente e la logica per l'autenticazione di un visitatore. Solo gli amministratori possono creare nuovi account. Sono disponibili pagine per la creazione e la gestione degli account utente nella ~/Admin cartella.

Configurazione delle API di appartenenza e ruoli

L'applicazione Web Book Reviews usa le API Appartenenza e Ruoli per supportare gli account utente e raggruppare tali utenti in ruoli (ovvero il ruolo Amministrazione). Le SqlMembershipProvider classi del provider e SqlRoleProvider vengono usate perché si vogliono archiviare le informazioni sull'account e sul ruolo in un database di SQL Server.

Nota

Questa esercitazione non è destinata a essere un esame dettagliato nella configurazione di un'applicazione Web per supportare le API appartenenza e ruoli. Per un'analisi approfondita di queste API e dei passaggi da eseguire per configurare un sito Web per usarle, leggere le esercitazioni sulla sicurezza dei siti Web.

Per usare i servizi dell'applicazione con un database SQL Server, è necessario innanzitutto aggiungere gli oggetti di database usati da questi provider al database in cui si desidera archiviare l'account utente e le informazioni sul ruolo. Questi oggetti di database necessari includono un'ampia gamma di tabelle, viste e stored procedure. Se non specificato diversamente, le SqlMembershipProvider classi del provider e SqlRoleProvider utilizzano un database SQL Server Express Edition denominato ASPNETDB nella cartella dell'applicazioneApp_Data. Se tale database non esiste, viene creato automaticamente con gli oggetti di database necessari da questi provider in fase di esecuzione.

È possibile, e in genere ideale, creare gli oggetti di database dei servizi applicazioni nello stesso database in cui vengono archiviati i dati specifici dell'applicazione del sito Web. .NET Framework viene fornito con uno strumento denominato aspnet_regsql.exe che installa gli oggetti di database in un database specificato. È stato usato questo strumento per aggiungere questi oggetti al Reviews.mdf database nella App_Data cartella (il database di sviluppo). Più avanti in questa esercitazione si vedrà come usare questo strumento quando si aggiungono questi oggetti al database di produzione.

Se si aggiungono oggetti di database dei servizi applicazioni a un database diverso ASPNETDB da è necessario personalizzare le configurazioni delle SqlMembershipProvider classi provider e SqlRoleProvider in modo che usino il database appropriato. Per personalizzare il provider di appartenenze, aggiungere un <elemento di appartenenza> all'interno della <system.web> sezione in Web.config; usare l'elemento <roleManager> per configurare il provider Roles. Il frammento seguente è tratto dall'applicazione Book Reviews e Web.config mostra le impostazioni di configurazione per le API Appartenenza e Ruoli. Si noti che entrambi registrano un nuovo provider e ReviewMembershipReviewRole che usano rispettivamente i SqlMembershipProvider provider e SqlRoleProvider .

<configuration>
    <system.web>
        ...

        <membership defaultProvider="ReviewMembership">
            <providers>
                <clear />

                <add type="System.Web.Security.SqlMembershipProvider" 
                     name="ReviewMembership" 
                     connectionStringName="ReviewsConnectionString" 
                     applicationName="BookReviews" />
            </providers>
        </membership>

        <roleManager enabled="true" defaultProvider="ReviewRole">
            <providers>
                <clear />

                <add type="System.Web.Security.SqlRoleProvider" 
                     name="ReviewRole" 
                     connectionStringName="ReviewsConnectionString" 
                     applicationName="BookReviews" />
            </providers>
        </roleManager>

        ...
    </system.web>
</configuration>

L'elemento Web.config del <authentication> file è stato configurato anche per supportare l'autenticazione basata su form.

<configuration>
    <system.web>
        ...

        <authentication mode="Forms" />

        ...
    </system.web>
</configuration>

Limitazione dell'accesso alle pagine di amministrazione

ASP.NET semplifica la concessione o la negazione dell'accesso a un file o a una cartella specifica da parte dell'utente o del ruolo tramite la relativa funzionalità di autorizzazione URL . L'autorizzazione url è stata descritta brevemente nell'esercitazione Differenze principali tra IIS e ASP.NET Development Server ed è stato illustrato in che modo IIS e il server di sviluppo ASP.NET applicano regole di autorizzazione URL in modo diverso per il contenuto statico e dinamico. Poiché si vuole impedire l'accesso alla ~/Admin cartella, ad eccezione di tali utenti nel ruolo Amministrazione, è necessario aggiungere regole di autorizzazione URL a questa cartella. In particolare, le regole di autorizzazione URL devono consentire agli utenti nel ruolo Amministrazione e negare tutti gli altri utenti. A tale scopo, aggiungere un Web.config file alla ~/Admin cartella con il contenuto seguente:

<?xml version="1.0"?>
<configuration>
    <system.web>
        <authorization>
            <allow roles="Admin" />
            <deny users="*" />
        </authorization>
    </system.web>
</configuration>

Per altre informazioni sulla funzionalità di autorizzazione url di ASP.NET e su come usarla per definire le regole di autorizzazione per gli utenti e per i ruoli, leggere le esercitazioni sull'autorizzazione basata su utenti e sulle autorizzazioni basate sui ruoli nelle esercitazioni sulla sicurezza del sito Web.

Distribuzione di un'applicazione Web che usa servizi applicazione

Quando si distribuisce un sito Web che usa servizi applicazione e un provider che archivia le informazioni sui servizi dell'applicazione in un database, è fondamentale che gli oggetti di database necessari per i servizi dell'applicazione vengano creati nel database di produzione. Inizialmente il database di produzione non contiene questi oggetti, quindi quando l'applicazione viene distribuita per la prima volta (o quando viene distribuita per la prima volta dopo l'aggiunta dei servizi applicazione), è necessario eseguire passaggi aggiuntivi per ottenere questi oggetti di database necessari nel database di produzione.

Un'altra sfida può verificarsi quando si distribuisce un sito Web che usa i servizi dell'applicazione se si intende replicare gli account utente creati nell'ambiente di sviluppo nell'ambiente di produzione. A seconda della configurazione appartenenza e ruoli, è possibile che, anche se si copiano correttamente gli account utente creati nell'ambiente di sviluppo nel database di produzione, questi utenti non possono accedere all'applicazione Web nell'ambiente di produzione. Si esaminerà la causa di questo problema e si esaminerà come impedirne la verifica.

ASP.NET viene fornito con un bel Strumento di amministrazione siti Web (WSAT) che può essere avviato da Visual Studio e consente di gestire l'account utente, i ruoli e le regole di autorizzazione tramite un'interfaccia basata sul Web. Sfortunatamente, WSAT funziona solo per i siti Web locali, il che significa che non può essere usato per gestire in remoto gli account utente, i ruoli e le regole di autorizzazione per l'applicazione Web nell'ambiente di produzione. Verranno esaminati diversi modi per implementare un comportamento simile a WSAT dal sito Web di produzione.

Aggiunta degli oggetti di database tramite aspnet_regsql.exe

L'esercitazione Distribuzione di un database ha illustrato come copiare le tabelle e i dati dal database di sviluppo al database di produzione e queste tecniche possono essere certamente usate per copiare gli oggetti di database dei servizi applicazioni nel database di produzione. Un'altra opzione è lo aspnet_regsql.exe strumento , che aggiunge o rimuove gli oggetti di database dei servizi applicazioni da un database.

Nota

Lo aspnet_regsql.exe strumento crea gli oggetti di database in un database specificato. Non esegue la migrazione dei dati in tali oggetti di database dal database di sviluppo al database di produzione. Se si intende copiare l'account utente e le informazioni sul ruolo nel database di sviluppo nel database di produzione, usare le tecniche descritte nell'esercitazione Distribuzione di un database .

Si esamini ora come aggiungere gli oggetti di database al database di produzione usando lo aspnet_regsql.exe strumento . Per iniziare, aprire Esplora risorse e passare alla directory .NET Framework versione 2.0 nel computer, %WINDIR%\ Microsoft.NET\Framework\v2.0.50727. Lì dovresti trovare lo aspnet_regsql.exe strumento. Questo strumento può essere usato dalla riga di comando, ma include anche un'interfaccia utente grafica; fare doppio clic sul file per avviare il aspnet_regsql.exe componente grafico.

Lo strumento inizia visualizzando una schermata iniziale che ne spiega lo scopo. Fare clic su Avanti per passare alla schermata "Selezionare un'opzione di installazione", visualizzata nella figura 1. Da qui è possibile scegliere di aggiungere gli oggetti di database dei servizi applicazioni o rimuoverli da un database. Poiché si desidera aggiungere questi oggetti al database di produzione, selezionare l'opzione "Configura SQL Server per i servizi applicazioni" e fare clic su Avanti.

Scegliere di configurare SQL Server per Servizi applicazioni

Figura 1: Scegliere di configurare SQL Server per Servizi applicazioni (fare clic per visualizzare l'immagine a dimensioni complete)

Nella schermata "Selezionare il server e il database" vengono richieste informazioni per la connessione al database. Immettere il server di database, le credenziali di sicurezza e il nome del database fornito dall'azienda di hosting Web e fare clic su Avanti.

Nota

Dopo aver immesso il server di database e le credenziali, è possibile che venga visualizzato un errore durante l'espansione dell'elenco a discesa del database. Lo aspnet_regsql.exe strumento esegue una query sulla sysdatabases tabella di sistema per recuperare un elenco di database nel server, ma alcune aziende di hosting Web bloccano i server di database in modo che queste informazioni non siano disponibili pubblicamente. Se viene visualizzato questo errore, è possibile digitare il nome del database direttamente nell'elenco a discesa.

Specificare lo strumento con le informazioni di connessione del database

Figura 2: Specificare lo strumento con le informazioni di connessione del database (fare clic per visualizzare l'immagine full-size)

La schermata successiva riepiloga le azioni che stanno per essere eseguite, ovvero che gli oggetti di database dei servizi applicazioni verranno aggiunti al database specificato. Fare clic su Avanti per completare questa azione. Dopo alcuni momenti, viene visualizzata la schermata finale, notando che gli oggetti di database sono stati aggiunti (vedere la figura 3).

Successo! Gli oggetti di database di Application Services sono stati aggiunti al database di produzione

Figura 3: Successo! Gli oggetti di database di Application Services sono stati aggiunti al database di produzione (fare clic per visualizzare l'immagine full-size)

Per verificare che gli oggetti di database dei servizi applicazioni siano stati aggiunti correttamente al database di produzione, aprire SQL Server Management Studio e connettersi al database di produzione. Come illustrato nella figura 4, è ora necessario visualizzare le tabelle di database dei servizi applicazioni nel database, aspnet_Applications, aspnet_Membership, aspnet_Userse così via.

Verificare che gli oggetti di database siano stati aggiunti al database di produzione

Figura 4: Verificare che gli oggetti di database siano stati aggiunti al database di produzione (fare clic per visualizzare l'immagine full-size)

È necessario usare lo strumento solo quando si distribuisce l'applicazione aspnet_regsql.exe Web per la prima volta o per la prima volta dopo aver avviato l'uso dei servizi applicazione. Una volta che questi oggetti di database si trovano nel database di produzione, non devono essere riaggiaggiati o modificati.

Copia degli account utente dallo sviluppo alla produzione

Quando si usano le classi e SqlRoleProvider provider per archiviare le SqlMembershipProvider informazioni sui servizi applicazione in un database SQL Server, le informazioni sull'account utente e sul ruolo vengono archiviate in diverse tabelle di database, tra cui aspnet_Users, aspnet_Membershipaspnet_Roles, e aspnet_UsersInRoles, tra le altre. Se durante lo sviluppo si creano account utente nell'ambiente di sviluppo, è possibile replicare gli account utente in produzione copiando i record corrispondenti dalle tabelle di database applicabili. Se è stata usata la Pubblicazione guidata database per distribuire gli oggetti di database dei servizi applicazioni, è possibile che sia stata selezionata anche per copiare i record, che comportano la creazione degli account utente creati in fase di sviluppo anche nell'ambiente di produzione. Tuttavia, a seconda delle impostazioni di configurazione, è possibile che gli utenti i cui account sono stati creati nello sviluppo e copiati nell'ambiente di produzione non siano in grado di accedere dal sito Web di produzione. Quali sono i vantaggi?

Le SqlMembershipProvider classi e SqlRoleProvider provider sono state progettate in modo che un singolo database possa fungere da archivio utenti per più applicazioni, in cui ogni applicazione potrebbe, in teoria, avere utenti con nomi utente e ruoli sovrapposti con lo stesso nome. Per consentire questa flessibilità, il database gestisce un elenco di applicazioni nella aspnet_Applications tabella e ogni utente è associato a una di queste applicazioni. In particolare, la aspnet_Users tabella ha una ApplicationId colonna che collega ogni utente a un record nella aspnet_Applications tabella.

Oltre alla ApplicationId colonna, la aspnet_Applications tabella include anche una ApplicationName colonna, che fornisce un nome più descrittivo per l'applicazione. Quando un sito Web tenta di usare un account utente, ad esempio convalidare le credenziali di un utente dalla pagina di accesso, deve indicare alla SqlMembershipProvider classe quale applicazione usare. Ciò avviene in genere specificando il nome dell'applicazione e questo valore proviene dalla configurazione del provider in Web.config , in particolare tramite l'attributo applicationName .

Ma cosa accade se l'attributo applicationName non è specificato in Web.config? In tal caso, il sistema Di appartenenza usa il percorso radice dell'applicazione come applicationName valore. Se l'attributo non è impostato in modo esplicito in Web.config, è possibile che l'ambiente applicationName di sviluppo e l'ambiente di produzione usino una radice dell'applicazione diversa e pertanto vengano associati a nomi di applicazioni diversi nei servizi applicazione. Se tale mancata corrispondenza si verifica, gli utenti creati nell'ambiente di sviluppo avranno un ApplicationId valore che non corrisponde al ApplicationId valore per l'ambiente di produzione. Il risultato netto è che gli utenti non potranno accedere.

Nota

Se si trova in questa situazione, con gli account utente copiati ApplicationId in produzione con un valore non corrispondente, è possibile scrivere una query per aggiornare questi valori non corretti ApplicationId all'oggetto usato nell'ambiente ApplicationId di produzione. Una volta aggiornato, gli utenti i cui account sono stati creati nell'ambiente di sviluppo potranno ora accedere all'applicazione Web in produzione.

La buona notizia è che è possibile eseguire un semplice passaggio per assicurarsi che i due ambienti usino lo stesso ApplicationId , impostando in modo esplicito l'attributo applicationName in Web.config per tutti i provider di servizi applicazione. L'attributo applicationName viene impostato in modo esplicito su "BookReviews" negli <membership> elementi e <roleManager> come questo frammento di codice da Web.config mostra.

<membership defaultProvider="ReviewMembership">
    <providers>
        <clear />

        <add type="System.Web.Security.SqlMembershipProvider" 
             name="ReviewMembership" 
             connectionStringName="ReviewsConnectionString" 
             applicationName="BookReviews" />
    </providers>
</membership>

Per altre discussioni sull'impostazione dell'attributo e sulla razionalità, fare riferimento al post di blog di Scott Guthrie, impostare sempre la proprietà applicationName durante la configurazione dell'appartenenzaapplicationName ASP.NET e altri provider.

Gestione degli account utente nell'ambiente di produzione

Lo strumento di amministrazione sito Web (WSAT) ASP.NET semplifica la creazione e la gestione degli account utente, la definizione e l'applicazione dei ruoli e la definizione delle regole di autorizzazione basate su utenti e ruoli. È possibile avviare WSAT da Visual Studio passando alla Esplora soluzioni e facendo clic sull'icona di configurazione ASP.NET oppure passando ai menu Sito Web o Progetto e selezionando la voce di menu ASP.NET Configurazione. Sfortunatamente, WSAT può funzionare solo con siti Web locali. Pertanto, non è possibile usare WSAT dalla workstation per gestire il sito Web nell'ambiente di produzione.

La buona notizia è che tutte le funzionalità esposte dalla WSAT sono disponibili a livello di codice tramite le API appartenenza e ruoli; inoltre, molte delle schermate WSAT usano i controlli standard ASP.NET correlati all'accesso. In breve, è possibile aggiungere pagine ASP.NET al sito Web che offrono le funzionalità di gestione necessarie.

Si ricordi che un'esercitazione precedente ha aggiornato l'applicazione Web Book Reviews per includere una ~/Admin cartella e questa cartella è stata configurata per consentire solo agli utenti nel ruolo di Amministrazione. È stata aggiunta una pagina a tale cartella denominata CreateAccount.aspx da cui un amministratore può creare un nuovo account utente. Questa pagina usa il controllo CreateUserWizard per visualizzare l'interfaccia utente e la logica back-end per la creazione di un nuovo account utente. Altro, ho personalizzato il controllo per includere una casella di controllo che richiede se il nuovo utente deve essere aggiunto anche al ruolo Amministrazione (vedere la figura 5). Con un po' di lavoro è possibile creare un set personalizzato di pagine che implementa le attività correlate alla gestione dell'utente e del ruolo che altrimenti verranno fornite dalla WSAT.

Nota

Per altre informazioni sull'uso delle API Appartenenza e ruoli insieme ai controlli Web ASP.NET correlati all'accesso, assicurarsi di leggere le esercitazioni sulla sicurezza del sito Web. Per altre informazioni sulla personalizzazione del controllo CreateUserWizard, vedere l'articolo Creazione di account utente e archiviazione di informazioni utente aggiuntive oppure vedere l'articolo Erich Peterson , personalizzazione del controllo CreateUserWizard.

Gli amministratori possono creare nuovi account utente

Figura 5: Gli amministratori possono creare nuovi account utente (fare clic per visualizzare l'immagine full-size)

Se è necessaria la funzionalità completa dello strumento Di amministrazione sito Web personalizzato, in cui l'autore Dan Clem illustra il processo di creazione di uno strumento WSAT personalizzato. Dan condivide il codice sorgente dell'applicazione (in C#) e fornisce istruzioni dettagliate per aggiungerlo al sito Web ospitato.

Riepilogo

Quando si distribuisce un'applicazione Web che usa l'implementazione del database dei servizi applicazioni, è prima necessario assicurarsi che il database di produzione disponga degli oggetti di database necessari. Questi oggetti possono essere aggiunti usando le tecniche descritte nell'esercitazione Distribuzione di un database ; in alternativa, è possibile usare lo aspnet_regsql.exe strumento, come illustrato in questa esercitazione. Altre sfide che abbiamo toccato sono incentrate sulla sincronizzazione del nome dell'applicazione usato negli ambienti di sviluppo e produzione (che è importante se si desidera che gli utenti e i ruoli creati nell'ambiente di sviluppo siano validi in produzione) e tecniche per la gestione degli utenti e dei ruoli nell'ambiente di produzione.

Programmazione felice!

Altre informazioni

Per altre informazioni sugli argomenti illustrati in questa esercitazione, vedere le risorse seguenti: