Condividi tramite


Creazione dello schema di appartenenza in SQL Server (C#)

di Scott Mitchell

Nota

Poiché questo articolo è stato scritto, i provider di appartenenza ASP.NET sono stati sostituiti da ASP.NET Identity. È consigliabile aggiornare le app per usare la ASP.NET Identity Platform anziché i provider di appartenenza in primo piano al momento della scrittura di questo articolo. ASP.NET Identity offre numerosi 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
  • Interoperabilità migliore con ASP.Net Core

Scaricare codice o scaricare pdf

Questa esercitazione inizia esaminando le tecniche per aggiungere lo schema necessario al database per usare SqlMembershipProvider. In seguito, verranno esaminate le tabelle chiave nello schema e si esamineranno lo scopo e l'importanza. Questa esercitazione termina con un'analisi su come indicare a un'applicazione ASP.NET che deve essere usato il provider del framework di appartenenza.

Introduzione

Le due esercitazioni precedenti sono state esaminate usando l'autenticazione dei moduli per identificare i visitatori del sito Web. Il framework di autenticazione dei moduli semplifica l'accesso di un utente a un sito Web e ricordarli attraverso l'uso dei ticket di autenticazione. La FormsAuthentication classe include metodi per generare il ticket e aggiungerlo ai cookie del visitatore. L'oggetto FormsAuthenticationModule esamina tutte le richieste in ingresso e, per quelle con un ticket di autenticazione valido, crea e associa un GenericPrincipal oggetto e alla FormsIdentity richiesta corrente. L'autenticazione dei moduli è semplicemente un meccanismo per concedere un ticket di autenticazione a un visitatore durante l'accesso e, nelle richieste successive, analizzare tale ticket per determinare l'identità dell'utente. Per un'applicazione Web che supporta gli account utente, è comunque necessario implementare un archivio utenti e aggiungere funzionalità per convalidare le credenziali, registrare nuovi utenti e la miriade di altre attività correlate all'account utente.

Prima di ASP.NET 2.0, gli sviluppatori erano sul hook per implementare tutte queste attività correlate all'account utente. Fortunatamente il team di ASP.NET ha riconosciuto questo problema e ha introdotto il framework di appartenenza con ASP.NET 2.0. Il framework di appartenenza è un set di classi in .NET Framework che forniscono un'interfaccia a livello di codice per l'esecuzione di attività correlate all'account utente di base. Questo framework viene compilato in cima al modello provider, che consente agli sviluppatori di collegare un'implementazione personalizzata in un'API standardizzata.

Come illustrato nell'esercitazione Informazioni di base sulla sicurezza e ASP.NET supporto , .NET Framework viene fornito con due provider di appartenenza predefiniti: ActiveDirectoryMembershipProvider e SqlMembershipProvider. Poiché il nome implica, l'oggetto SqlMembershipProvider usa un database microsoft SQL Server come archivio utenti. Per usare questo provider in un'applicazione, è necessario indicare al provider quale database usare come archivio. Come si potrebbe immaginare, il SqlMembershipProvider database dell'archivio utenti prevede che siano presenti determinate tabelle, viste e stored procedure del database. È necessario aggiungere questo schema previsto al database selezionato.

Questa esercitazione inizia esaminando le tecniche per aggiungere lo schema necessario al database per usare .SqlMembershipProvider In seguito, verranno esaminate le tabelle chiave nello schema e si esamineranno lo scopo e l'importanza. Questa esercitazione termina con un'analisi su come indicare a un'applicazione ASP.NET che deve essere usato il provider del framework di appartenenza.

È possibile iniziare subito.

Passaggio 1: Decidere dove inserire l'archivio utenti

I dati di un'applicazione di ASP.NET vengono in genere archiviati in una serie di tabelle in un database. Quando si implementa lo schema del database, è necessario decidere se inserire lo SqlMembershipProvider schema di appartenenza nello stesso database dei dati dell'applicazione o in un database alternativo.

È consigliabile individuare lo schema Di appartenenza nello stesso database dei dati dell'applicazione per i motivi seguenti:

  • Gestibilità ' un'applicazione i cui dati sono incapsulati in un database è più facile da comprendere, gestire e distribuire rispetto a un'applicazione con due database separati.
  • Integrità relazionale ' individuando le tabelle correlate all'appartenenza nello stesso database delle tabelle dell'applicazione è possibile stabilire vincoli di chiave esterna tra le chiavi primarie nelle tabelle correlate all'appartenenza e nelle tabelle dell'applicazione correlate all'appartenenza.

La disaccoppiamento dei dati dell'archivio utente e dell'applicazione in database separati ha senso solo se sono presenti più applicazioni che usano database separati, ma è necessario condividere un archivio utenti comune.

Creazione di un database

L'applicazione creata dopo la seconda esercitazione non ha ancora bisogno di un database. È tuttavia necessario uno per l'archivio utenti. Verrà creato uno e quindi aggiunto allo schema richiesto dal SqlMembershipProvider provider (vedere Passaggio 2).

Nota

In questa serie di esercitazioni verrà usato un database microsoft SQL Server 2005 Express Edition per archiviare le tabelle dell'applicazione e lo SqlMembershipProvider schema. Questa decisione è stata presa per due motivi: prima, a causa del suo costo - gratuito - Express Edition è la versione più leggibile di SQL Server 2005; secondo, i database SQL Server 2005 Express Edition possono essere inseriti direttamente nell'applicazione App_Data Web cartella, rendendolo un cinch per creare un pacchetto del database e dell'applicazione Web insieme in un file ZIP e ridistribuirlo senza istruzioni di configurazione speciali o opzioni di configurazione. Se si preferisce seguire l'uso di una versione non Express Edition di SQL Server, si è liberi. I passaggi sono praticamente identici. Lo SqlMembershipProvider schema funzionerà con qualsiasi versione di Microsoft SQL Server 2000 e versioni successive.

Dal Esplora soluzioni fare clic con il pulsante destro del mouse sulla App_Data cartella e scegliere Aggiungi nuovo elemento. Se non viene visualizzata una App_Data cartella nel progetto, fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni, selezionare Aggiungi cartella ASP.NET e scegliere App_Data.) Nella finestra di dialogo Aggiungi nuovo elemento scegliere di aggiungere una nuova database SQL denominata SecurityTutorials.mdf. In questa esercitazione verrà aggiunto lo SqlMembershipProvider schema al database. Nelle esercitazioni successive verranno create tabelle aggiuntive per acquisire i dati dell'applicazione.

Aggiungere un nuovo database SQL database denominato SecurityTutorials.mdf alla cartella App_Data

Figura 1: Aggiungere un nuovo database SQL database denominato SecurityTutorials.mdf alla App_Data cartella (fare clic per visualizzare l'immagine full-size)

L'aggiunta di un database alla App_Data cartella lo include automaticamente nella visualizzazione Esplora database. Nella versione non Express Edition di Visual Studio, Esplora database viene chiamato Esplora server. Passare a Esplora database e espandere il database appena aggiunto SecurityTutorials . Se esplora database non viene visualizzato sullo schermo, passare al menu Visualizza e scegliere Esplora database oppure premere CTRL+ALT+S. Come illustrato nella figura 2, il SecurityTutorials database è vuoto: non contiene tabelle, viste e nessuna stored procedure.

Il database SecurityTutorials è attualmente vuoto

Figura 2: Il SecurityTutorials database è attualmente vuoto (fare clic per visualizzare l'immagine full-size)

Passaggio 2: Aggiunta delloSqlMembershipProviderschema al database

Richiede SqlMembershipProvider un determinato set di tabelle, viste e stored procedure da installare nel database dell'archivio utenti. Questi oggetti di database necessari possono essere aggiunti usando lo aspnet_regsql.exe strumento. Questo file si trova nella %WINDIR%\Microsoft.Net\Framework\v2.0.50727\ cartella.

Nota

Lo aspnet_regsql.exe strumento offre funzionalità della riga di comando e un'interfaccia utente grafica. L'interfaccia grafica è più intuitiva ed è ciò che verrà esaminato in questa esercitazione. L'interfaccia della riga di comando è utile quando l'aggiunta dello schema deve essere automatizzata, ad esempio negli script di SqlMembershipProvider compilazione o negli scenari di test automatizzati.

Lo aspnet_regsql.exe strumento viene usato per aggiungere o rimuovere ASP.NET servizi applicazione a un database SQL Server specificato. I servizi dell'applicazione ASP.NET includono gli schemi per e SqlMembershipProvider , SqlRoleProviderinsieme agli schemi per i provider basati su SQL per altri framework ASP.NET 2.0. È necessario fornire due bit di informazioni allo aspnet_regsql.exe strumento:

  • Se si desidera aggiungere o rimuovere i servizi applicazione e
  • Database da cui aggiungere o rimuovere lo schema dei servizi applicazione

Quando si chiede al database di usare, lo aspnet_regsql.exe strumento chiede di specificare il nome del server in cui risiede il database, le credenziali di sicurezza per la connessione al database e il nome del database. Se si usa l'edizione non Express di SQL Server, è consigliabile conoscere già queste informazioni, poiché sono le stesse informazioni che è necessario fornire tramite un stringa di connessione quando si lavora con il database tramite una pagina Web ASP.NET. Determinare il server e il nome del database quando si usa un database SQL Server 2005 Express Edition nella App_Data cartella, tuttavia, è un po' più coinvolto.

Nella sezione seguente viene esaminato un modo semplice per specificare il server e il nome del database per un database SQL Server 2005 Express Edition nella App_Data cartella. Se non si usa SQL Server 2005 Express Edition è possibile passare alla sezione Installazione di Servizi applicazioni.

Determinazione del nome del server e del database per un database SQL Server 2005 Express Edition nellaApp_Datacartella

Per usare lo aspnet_regsql.exe strumento è necessario conoscere i nomi del server e del database. Il nome del server è localhost\InstanceName. Probabilmente, instanceName è SQLExpress. Tuttavia, se è stato installato SQL Server 2005 Express Edition manualmente , ovvero non è stato installato automaticamente durante l'installazione di Visual Studio, è possibile che sia stato selezionato un nome di istanza diverso.

Il nome del database è un po' più difficile da determinare. I database nella App_Data cartella in genere hanno un nome di database che include un identificatore univoco globale insieme al percorso del file di database. È necessario determinare questo nome di database per aggiungere lo schema dei servizi applicazione tramite aspnet_regsql.exe.

Il modo più semplice per verificare il nome del database consiste nell'esaminarlo tramite SQL Server Management Studio. SQL Server Management Studio fornisce un'interfaccia grafica per la gestione di database SQL Server 2005, ma non viene fornita con Express Edition di SQL Server 2005. La buona notizia è che è possibile scaricare l'edizione Express gratuita di SQL Server Management Studio.

Nota

Se si dispone anche di una versione non Express Edition di SQL Server 2005 installata nel desktop, è probabile che sia installata la versione completa di Management Studio. È possibile usare la versione completa per determinare il nome del database, seguendo la stessa procedura descritta di seguito per Express Edition.

Iniziare chiudendo Visual Studio per assicurarsi che tutti i blocchi imposti da Visual Studio nel file di database siano chiusi. Avviare quindi SQL Server Management Studio e connettersi al localhost\InstanceName database per SQL Server 2005 Express Edition. Come indicato in precedenza, le probabilità che il nome dell'istanza sia SQLExpress. Per l'opzione Autenticazione selezionare Autenticazione di Windows.

Connettersi all'istanza di SQL Server 2005 Express Edition

Figura 3: Connettersi all'istanza di SQL Server 2005 Express Edition (fare clic per visualizzare l'immagine a dimensioni complete)

Dopo la connessione all'istanza di SQL Server 2005 Express Edition, Management Studio visualizza cartelle per i database, le impostazioni di sicurezza, gli oggetti server e così via. Se si espande la scheda Database si noterà che il SecurityTutorials.mdf database non è registrato nell'istanza del database, è necessario collegare prima il database.

Fare clic con il pulsante destro del mouse sulla cartella Database e scegliere Collega dal menu di scelta rapida. Verrà visualizzata la finestra di dialogo Collega database. Da qui fare clic sul pulsante Aggiungi, passare al SecurityTutorials.mdf database e fare clic su OK. La figura 4 mostra la finestra di dialogo Collega database dopo aver selezionato il SecurityTutorials.mdf database. La figura 5 mostra la Esplora oggetti di Management Studio dopo che il database è stato collegato correttamente.

Collegare il database SecurityTutorials.mdf

Figura 4: Collegare il database (fare clic per visualizzare l'immagineSecurityTutorials.mdf full-size)

Il database SecurityTutorials.mdf viene visualizzato nella cartella Database

Figura 5: Il SecurityTutorials.mdf database viene visualizzato nella cartella Database (fare clic per visualizzare l'immagine a dimensioni complete)

Come illustrato nella figura 5, il SecurityTutorials.mdf database ha un nome piuttosto instruso. È possibile modificarlo in un nome più memorabile (e più facile da digitare). Fare clic con il pulsante destro del mouse sul database, scegliere Rinomina dal menu di scelta rapida e rinominarlo SecurityTutorialsDatabase. Questo non modifica il nome del file, solo il nome usato dal database per identificarsi per SQL Server.

Rinominare il database in SecurityTutorialsDatabase

Figura 6: Rinominare il database in SecurityTutorialsDatabase(Fare clic per visualizzare l'immagine full-size)

A questo punto si conoscono i nomi del server e del database per il file di SecurityTutorials.mdf database: localhost\InstanceName e SecurityTutorialsDatabase, rispettivamente. È ora possibile installare i servizi dell'applicazione tramite lo aspnet_regsql.exe strumento.

Installazione dei servizi applicazione

Per avviare lo aspnet_regsql.exe strumento, passare al menu start e scegliere Esegui. Immettere %WINDIR%\Microsoft.Net\Framework\v2.0.50727\aspnet_regsql.exe nella casella di testo e fare clic su OK. In alternativa, è possibile usare Esplora risorse per eseguire il drill-down nella cartella appropriata e fare doppio clic sul aspnet_regsql.exe file. Entrambi gli approcci conterrà gli stessi risultati.

L'esecuzione dello strumento senza alcun argomento della riga di comando avvia l'interfaccia aspnet_regsql.exe utente grafica dell'installazione guidata di ASP.NET SQL Server. La procedura guidata semplifica l'aggiunta o la rimozione dei servizi applicazioni ASP.NET in un database specificato. La prima schermata della procedura guidata, illustrata nella figura 7, descrive lo scopo dello strumento.

Usare la procedura guidata di installazione di ASP.NET SQL Server per aggiungere lo schema di appartenenza

Figura 7: Usare l'installazione guidata ASP.NET SQL Server Consente di aggiungere lo schema di appartenenza (fare clic per visualizzare l'immagine a dimensioni complete)

Il secondo passaggio della procedura guidata chiede se si vuole aggiungere i servizi dell'applicazione o rimuoverli. Poiché si vogliono aggiungere le tabelle, le visualizzazioni e le stored procedure necessarie per SqlMembershipProvider, scegliere l'opzione Configura SQL Server per i servizi applicazioni. In seguito, se si vuole rimuovere questo schema dal database, eseguire nuovamente questa procedura guidata, ma scegliere invece l'opzione Rimuovi le informazioni sui servizi applicazione da un database esistente.

Scegliere l'opzione Configura SQL Server per Servizi applicazioni

Figura 8: scegliere l'opzione Configura SQL Server per Servizi applicazioni (fare clic per visualizzare l'immagine a dimensioni complete)

Il terzo passaggio richiede informazioni sul database: nome del server, informazioni di autenticazione e nome del database. Se si è seguito insieme a questa esercitazione e si è aggiunto il SecurityTutorials.mdf database a App_Data, collegato a localhost\InstanceNamee rinominato SecurityTutorialsDatabasein , usare i valori seguenti:

  • Server: localhost\InstanceName
  • Autenticazione di Windows
  • Database: SecurityTutorialsDatabase

Immettere le informazioni sul database

Figura 9: Immettere le informazioni sul database (fare clic per visualizzare l'immagine full-size)

Dopo aver immesso le informazioni sul database, fare clic su Avanti. Il passaggio finale riepiloga i passaggi che verranno eseguiti. Fare clic su Avanti per installare i servizi applicazione e quindi fine per completare la procedura guidata.

Nota

Se Si usa Management Studio per collegare il database e rinominare il file di database, assicurarsi di scollegare il database e chiudere Management Studio prima di riaprire Visual Studio. Per scollegare il database, fare clic con il pulsante destro del mouse sul nome del SecurityTutorialsDatabase database e scegliere Scollega dal menu Attività.

Al termine della procedura guidata, tornare a Visual Studio e passare a Esplora database. Espandere la cartella Tabelle. Verrà visualizzata una serie di tabelle i cui nomi iniziano con il prefisso aspnet_. Analogamente, è possibile trovare diverse visualizzazioni e stored procedure nelle cartelle Visualizzazioni e stored procedure. Questi oggetti di database costituiscono lo schema dei servizi applicazione. Verranno esaminati gli oggetti di database specifici del ruolo e di appartenenza nel passaggio 3.

Un'ampia gamma di tabelle, viste e stored procedure sono state aggiunte al database

Figura 10: sono state aggiunte diverse tabelle, visualizzazioni e stored procedure al database (fare clic per visualizzare l'immagine full-size)

Nota

L'interfaccia aspnet_regsql.exe utente grafica dello strumento installa l'intero schema dei servizi applicazione. Tuttavia, quando si esegue aspnet_regsql.exe dalla riga di comando è possibile specificare quali componenti dei servizi applicazioni specifici installare (o rimuovere). Pertanto, se si desidera aggiungere solo le tabelle, le visualizzazioni e le stored procedure necessarie per i SqlMembershipProvider provider e SqlRoleProvider , eseguire aspnet_regsql.exe dalla riga di comando. In alternativa, è possibile eseguire manualmente il subset appropriato di script di creazione T-SQL usati da aspnet_regsql.exe. Questi script si trovano nella WINDIR%\Microsoft.Net\Framework\v2.0.50727\ cartella con nomi come InstallCommon.sql,InstallMembership.sql, ,InstallRoles.sqlInstallProfile.sql ,InstallSqlState.sql e così via.

A questo punto sono stati creati gli oggetti di database necessari dall'oggetto SqlMembershipProvider. Tuttavia, è comunque necessario indicare al framework di appartenenza che deve usare ( SqlMembershipProvider e, ad esempio, ActiveDirectoryMembershipProvider) e che deve SqlMembershipProvider usare il SecurityTutorials database. Verrà illustrato come specificare il provider da usare e come personalizzare le impostazioni del provider selezionato nel passaggio 4. Ma prima di tutto, esaminiamo più approfonditamente gli oggetti di database appena creati.

Passaggio 3: Esaminare le tabelle principali dello schema

Quando si riguardano i framework di appartenenza e ruoli in un'applicazione ASP.NET, i dettagli dell'implementazione vengono incapsulati dal provider. Nelle esercitazioni future verranno interfacce con questi framework tramite le classi e Roles .NET FrameworkMembership. Quando si usano queste API di alto livello non è necessario preoccuparsi dei dettagli di basso livello, ad esempio le query eseguite o le tabelle modificate da SqlMembershipProvider e SqlRoleProvider.

A questo scopo, è possibile usare in modo sicuro i framework appartenenza e ruoli senza aver esplorato lo schema del database creato nel passaggio 2. Tuttavia, quando si creano le tabelle per archiviare i dati dell'applicazione, potrebbe essere necessario creare entità correlate agli utenti o ai ruoli. Consente di avere familiarità con gli SqlMembershipProvider schemi e SqlRoleProvider durante la definizione di vincoli di chiave esterna tra le tabelle dati dell'applicazione e quelle tabelle create nel passaggio 2. Inoltre, in determinate circostanze rare potrebbe essere necessario interfacciarsi con l'utente e il ruolo archivia direttamente a livello di database (anziché tramite le Membership classi o Roles ).

Partizionamento dell'archivio utenti in applicazioni

I framework appartenenza e ruoli sono progettati in modo che un singolo utente e un archivio ruoli possano essere condivisi tra molte applicazioni diverse. Un'applicazione ASP.NET che usa i framework appartenenza o ruoli deve specificare la partizione dell'applicazione da usare. In breve, più applicazioni Web possono usare lo stesso archivio utenti e ruoli. La figura 11 illustra gli archivi di utenti e ruoli partizionati in tre applicazioni: HRSite, CustomerSite e SalesSite. Queste tre applicazioni Web hanno i propri utenti e ruoli univoci, ma tutti archiviano fisicamente l'account utente e le informazioni sul ruolo nelle stesse tabelle di database.

Gli account utente possono essere partizionati in più applicazioni

Figura 11: Gli account utente possono essere partizionati in più applicazioni (fare clic per visualizzare l'immagine a dimensioni complete)

La aspnet_Applications tabella è ciò che definisce queste partizioni. Ogni applicazione che usa il database per archiviare le informazioni sull'account utente è rappresentata da una riga in questa tabella. La aspnet_Applications tabella include quattro colonne: ApplicationId, ApplicationName, LoweredApplicationNamee Description. ApplicationId è di tipo uniqueidentifier ed è la chiave primaria della tabella. ApplicationName Fornisce un nome univoco descrittivo per ogni applicazione.

Le altre tabelle relative all'appartenenza e al ruolo vengono collegate nuovamente al ApplicationId campo in aspnet_Applications. Ad esempio, la aspnet_Users tabella, che contiene un record per ogni account utente, ha un ApplicationId campo chiave esterna; ditto per la aspnet_Roles tabella. Il ApplicationId campo in queste tabelle specifica la partizione dell'applicazione a cui appartiene l'account utente o il ruolo.

Archiviazione delle informazioni sull'account utente

Le informazioni sull'account utente sono ospitate in due tabelle: aspnet_Users e aspnet_Membership. La aspnet_Users tabella contiene campi che contengono le informazioni essenziali sull'account utente. Le tre colonne più pertinenti sono:

  • UserId
  • UserName
  • ApplicationId

UserId è la chiave primaria (e di tipo uniqueidentifier). UserName è di tipo nvarchar(256) e, insieme alla password, costituisce le credenziali dell'utente. La password di un utente viene archiviata nella aspnet_Membership tabella. ApplicationId collega l'account utente a un'applicazione specifica in aspnet_Applications. Esiste un vincolo composito UNIQUE sulle UserName colonne eApplicationId. Ciò garantisce che in un'applicazione specifica ogni Nome utente sia univoco, ma consente lo stesso UserName utilizzo in applicazioni diverse.

La aspnet_Membership tabella include informazioni aggiuntive sull'account utente, ad esempio la password dell'utente, l'indirizzo di posta elettronica, la data e l'ora dell'ultimo accesso e così via. Esiste una corrispondenza uno-a-uno tra i record nelle aspnet_Users tabelle e aspnet_Membership . Questa relazione viene garantita dal UserId campo in aspnet_Membership, che funge da chiave primaria della tabella. Come la aspnet_Users tabella, aspnet_Membership include un ApplicationId campo che collega queste informazioni a una determinata partizione dell'applicazione.

Protezione delle password

Le informazioni sulla password vengono archiviate nella aspnet_Membership tabella. Consente SqlMembershipProvider di archiviare le password nel database usando una delle tre tecniche seguenti:

  • Cancella : la password viene archiviata nel database come testo normale. Sconsiglio fortemente l'uso di questa opzione. Se il database è compromesso, essere da parte di un hacker che trova una porta posteriore o un dipendente disgruente che ha accesso al database, tutte le credenziali dell'utente singolo sono presenti per l'acquisizione.
  • Hashed : le password vengono hashate usando un algoritmo hash unidirezionale e un valore salt generato in modo casuale. Questo valore hashed (insieme al sale) viene archiviato nel database.
  • Crittografato : una versione crittografata della password viene archiviata nel database.

La tecnica di archiviazione delle password usata dipende dalle SqlMembershipProvider impostazioni specificate in Web.config. Verrà esaminata la personalizzazione delle SqlMembershipProvider impostazioni nel passaggio 4. Il comportamento predefinito consiste nell'archiviare l'hash della password.

Le colonne responsabili dell'archiviazione della password sono Password, PasswordFormate PasswordSalt. PasswordFormat è un campo di tipo int il cui valore indica la tecnica utilizzata per archiviare la password: 0 per Clear; 1 per Hashed; 2 per Encrypted. PasswordSalt viene assegnata una stringa generata in modo casuale indipendentemente dalla tecnica di archiviazione password usata; il valore di PasswordSalt viene usato solo quando si calcola l'hash della password. Infine, la Password colonna contiene i dati effettivi della password, ad esempio la password in testo normale, l'hash della password o la password crittografata.

La tabella 1 illustra quali tre colonne potrebbero essere simili alle varie tecniche di archiviazione durante l'archiviazione della password MySecret! .

Tecnica< di archiviazione_o3a_p /> Password<_o3a_p/> PasswordFormat<_o3a_p/> PasswordSalt<_o3a_p />
Cancella MySecret! 0 tTnkPlesqissc2y2SMEygA==
Con hash 2oXm6sZHWbTHFgjgkGQsc2Ec9ZM= 1 wFgjUfhdUFUFOCKQiI61vtiQ==
Crittografato 62RZgDvhxykkqsMchZ0Yly7HS6onhpaoCYaRxV8g0F4CW56OXUU3e7Inza9j9BKp 2 LSRzhGS/aa/oqAXGLHJNBw==

Tabella 1: Valori di esempio per i campi Password-Related durante l'archiviazione della password MySecret!

Nota

L'algoritmo di crittografia o hash specifico utilizzato dall'oggetto SqlMembershipProvider è determinato dalle impostazioni dell'elemento <machineKey> .

Archiviazione di ruoli e associazioni di ruoli

Il framework Ruoli consente agli sviluppatori di definire un set di ruoli e specificare quali utenti appartengono ai ruoli. Queste informazioni vengono acquisite nel database tramite due tabelle: aspnet_Roles e aspnet_UsersInRoles. Ogni record nella aspnet_Roles tabella rappresenta un ruolo per un'applicazione specifica. Analogamente alla tabella, la aspnet_Usersaspnet_Roles tabella presenta tre colonne pertinenti alla discussione:

  • RoleId
  • RoleName
  • ApplicationId

RoleId è la chiave primaria (e di tipo uniqueidentifier). RoleName è di tipo nvarchar(256). E ApplicationId collega l'account utente a una determinata applicazione in aspnet_Applications. Esiste un vincolo composito UNIQUE sulle RoleName colonne e ApplicationId , assicurandosi che in un'applicazione specifica ogni nome di ruolo sia univoco.

La aspnet_UsersInRoles tabella funge da mapping tra utenti e ruoli. Esistono solo due colonne UserId , e RoleId e insieme costituiscono una chiave primaria composita.

Passaggio 4: Specifica del provider e personalizzazione delle impostazioni

Tutti i framework che supportano il modello del provider, ad esempio i framework appartenenza e ruoli, non dispongono dei dettagli di implementazione stessi e delegano invece tale responsabilità a una classe provider. Nel caso del framework Di appartenenza, la Membership classe definisce l'API per la gestione degli account utente, ma non interagisce direttamente con qualsiasi archivio utenti. Invece, i Membership metodi della classe eseguono la richiesta al provider configurato: verrà usato .SqlMembershipProvider Quando si richiama uno dei metodi nella Membership classe, in che modo il framework di appartenenza sa delegare la chiamata all'oggetto SqlMembershipProvider?

La Membership classe ha una proprietà che contiene un Providers riferimento a tutte le classi di provider registrate disponibili per l'uso da parte del framework Membership. Ogni provider registrato ha un nome e un tipo associati. Il nome offre un modo descrittivo per fare riferimento a un determinato provider nella Providers raccolta, mentre il tipo identifica la classe del provider. Inoltre, ogni provider registrato può includere impostazioni di configurazione. Le impostazioni di configurazione per il framework di appartenenza includono passwordFormat e requiresUniqueEmail, tra molte altre. Vedere Tabella 2 per un elenco completo delle impostazioni di configurazione usate da SqlMembershipProvider.

Il Providers contenuto della proprietà viene specificato tramite le impostazioni di configurazione dell'applicazione Web. Per impostazione predefinita, tutte le applicazioni Web hanno un provider denominato AspNetSqlMembershipProvider di tipo SqlMembershipProvider. Questo provider di appartenenza predefinito è registrato in (situato in machine.config%WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG):

<membership>
 <providers>
 <add name="AspNetSqlMembershipProvider"
 type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
 connectionStringName="LocalSqlServer"
 enablePasswordRetrieval="false"
 enablePasswordReset="true"
 requiresQuestionAndAnswer="true"
 applicationName="/"
 requiresUniqueEmail="false"
 passwordFormat="Hashed"
 maxInvalidPasswordAttempts="5"
 minRequiredPasswordLength="7"
 minRequiredNonalphanumericCharacters="1"
 passwordAttemptWindow="10"
 passwordStrengthRegularExpression=""/>
 </providers> 
</membership>

Come illustrato nel markup precedente, l'elemento<membership> definisce le impostazioni di configurazione per il framework di appartenenza mentre l'elemento<providers> figlio specifica i provider registrati. I provider possono essere aggiunti o rimossi usando gli <add> elementi o <remove> ; usare l'elemento <clear> per rimuovere tutti i provider attualmente registrati. Come illustrato nel markup precedente, machine.config aggiunge un provider denominato AspNetSqlMembershipProvider di tipo SqlMembershipProvider.

Oltre agli attributi etype, l'elemento <add>name contiene attributi che definiscono i valori per varie impostazioni di configurazione. La tabella 2 elenca le impostazioni di configurazione specifiche disponibili SqlMembershipProvider, insieme a una descrizione di ognuna.

Nota

Tutti i valori predefiniti annotati nella tabella 2 fanno riferimento ai valori predefiniti definiti nella SqlMembershipProvider classe. Si noti che non tutte le impostazioni di configurazione in AspNetSqlMembershipProvider corrispondono ai valori predefiniti della SqlMembershipProvider classe. Ad esempio, se non specificato in un provider di appartenenza, l'impostazione requiresUniqueEmail predefinita è true. Tuttavia, il AspNetSqlMembershipProvider valore predefinito viene sottoposto a override specificando in modo esplicito un valore di false.

Impostazione<_o3a_p/> Descrizione<_o3a_p/>
ApplicationName Si ricordi che il framework di appartenenza consente di partizionare un singolo archivio utenti tra più applicazioni. Questa impostazione indica il nome della partizione dell'applicazione utilizzata dal provider di appartenenza. Se questo valore non è specificato in modo esplicito, è impostato, in fase di esecuzione, sul valore del percorso radice virtuale dell'applicazione.
commandTimeout Specifica il valore del timeout dei comandi SQL (in secondi). Il valore predefinito è 30.
connectionStringName Nome del stringa di connessione nell'elemento <connectionStrings> da usare per connettersi al database dell'archivio utenti. Questo valore è obbligatorio.
description Fornisce una descrizione descrittiva del provider registrato.
enablePasswordRetrieval Specifica se gli utenti possono recuperare la password dimenticata. Il valore predefinito è false.
enablePasswordReset Indica se gli utenti possono reimpostare la password. Il valore predefinito è true.
maxInvalidPasswordAttempts Numero massimo di tentativi di accesso non riusciti che possono verificarsi per un determinato utente durante l'oggetto specificato passwordAttemptWindow prima che l'utente venga bloccato. Il valore predefinito è 5.
minRequiredNonalphanumericCharacters Numero minimo di caratteri non alfanumerici che devono essere visualizzati nella password di un utente. Questo valore deve essere compreso tra 0 e 128; il valore predefinito è 1.
minRequiredPasswordLength Numero minimo di caratteri necessari in una password. Questo valore deve essere compreso tra 0 e 128; il valore predefinito è 7.
name Nome del provider registrato. Questo valore è obbligatorio.
passwordAttemptWindow Numero di minuti durante i quali vengono rilevati tentativi di accesso non riusciti. Se un utente specifica i maxInvalidPasswordAttempts tempi di accesso non validi all'interno di questa finestra specificata, vengono bloccati. Il valore predefinito è 10.
PasswordFormat Formato di archiviazione password: Clear, Hashedo Encrypted. Il valore predefinito è Hashed.
passwordStrengthRegularExpression Se specificato, questa espressione regolare viene usata per valutare la forza della password selezionata dell'utente durante la creazione di un nuovo account o quando si modifica la password. Il valore predefinito è una stringa vuota.
requiresQuestionAndAnswer Specifica se un utente deve rispondere alla domanda di sicurezza durante il recupero o la reimpostazione della password. Il valore predefinito è true.
requiresUniqueEmail Indica se tutti gli account utente in una determinata partizione dell'applicazione devono avere un indirizzo di posta elettronica univoco. Il valore predefinito è true.
type Specifica il tipo del provider. Questo valore è obbligatorio.

Tabella 2: Appartenenza e SqlMembershipProvider impostazioni di configurazione

Oltre a AspNetSqlMembershipProvider, altri provider di appartenenza possono essere registrati in base all'applicazione aggiungendo markup simile al Web.config file.

Nota

Il framework Ruoli funziona in modo analogo: è presente un provider di ruoli registrato predefinito in machine.config e i provider registrati possono essere personalizzati in base a un'applicazione in base all'applicazione in Web.config. Verrà esaminato il framework Ruoli e il relativo markup di configurazione in dettaglio in un'esercitazione futura.

Personalizzazione delleSqlMembershipProviderimpostazioni

Il valore predefinito SqlMembershipProvider (AspNetSqlMembershipProvider) ha il relativo connectionStringName attributo impostato su LocalSqlServer. Analogamente al provider, il AspNetSqlMembershipProvider nome LocalSqlServer stringa di connessione viene definito in machine.config.

<connectionStrings> 
 <add name="LocalSqlServer" 
 connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" 
 providerName="System.Data.SqlClient"/> 
</connectionStrings>

Come si può notare, questa stringa di connessione definisce un database DI SQL 2005 Express Edition disponibile in |DataDirectory|aspnetdb.mdf'. Stringa |DataDirectory| viene tradotto in fase di esecuzione per puntare alla directory, quindi il percorso del ~/App_Data/ database |DataDirectory|aspnetdb.mdf" viene convertito in ~/App_Data/aspnet.mdf.

Se non sono state specificate informazioni sul provider di appartenenza nel file dell'applicazione Web.config , l'applicazione usa il provider di appartenenza registrato predefinito, AspNetSqlMembershipProvider. Se il ~/App_Data/aspnet.mdf database non esiste, il runtime di ASP.NET lo creerà automaticamente e aggiungerà lo schema dei servizi applicazioni. Tuttavia, non si vuole usare il database. Invece, si vuole usare il aspnet.mdfSecurityTutorials.mdf database creato nel passaggio 2. Questa modifica può essere eseguita in uno dei due modi seguenti:

  • Specificare un valore per l'oggettoLocalSqlServerstringa di connessione nome inWeb.config. Sovrascrivendo il valore del nome stringa di connessione in Web.config, è possibile usare il LocalSqlServer provider di appartenenza registrato predefinito (AspNetSqlMembershipProvider) e usarlo correttamente con il SecurityTutorials.mdf database. Questo approccio è corretto se si è contenuti con le impostazioni di configurazione specificate da AspNetSqlMembershipProvider. Per altre informazioni su questa tecnica, vedere il post di blog di Scott Guthrie, Configurazione di servizi applicazioni ASP.NET 2.0 per usare SQL Server 2000 o SQL Server 2005.
  • Aggiungere un nuovo provider registrato di tipoSqlMembershipProvidere configurare il relativoconnectionStringNameimpostazione per puntare all'oggettoSecurityTutorials.mdfDatabase. Questo approccio è utile negli scenari in cui si desidera personalizzare altre proprietà di configurazione oltre al database stringa di connessione. Nei miei progetti ho sempre usato questo approccio a causa della sua flessibilità e leggibilità.

Prima di poter aggiungere un nuovo provider registrato che fa riferimento al SecurityTutorials.mdf database, è prima necessario aggiungere un valore stringa di connessione appropriato nella <connectionStrings> sezione in Web.config. Il markup seguente aggiunge una nuova stringa di connessione denominata SecurityTutorialsConnectionString che fa riferimento al database SQL Server 2005 Express Edition SecurityTutorials.mdf nella App_Data cartella.

<configuration>
 <connectionStrings>
 <add name="SecurityTutorialsConnectionString" 
 connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SecurityTutorials.mdf;Integrated Security=True;User Instance=True" 
 providerName="System.Data.SqlClient"/> 
 </connectionStrings> 
 <system.web>
 ... Configuration markup  removed for brevity ... 
 </system.web>
</configuration>

Nota

Se si usa un file di database alternativo, aggiornare il stringa di connessione in base alle esigenze. Per altre informazioni sulla maschera della stringa di connessione corretta, vedere ConnectionStrings.com.

Aggiungere quindi il markup di configurazione dell'appartenenza seguente al Web.config file. Questo markup registra un nuovo provider denominato SecurityTutorialsSqlMembershipProvider.

<configuration> 
 <connectionStrings>
 <add name="SecurityTutorialsConnectionString" 
 connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SecurityTutorials.mdf;Integrated Security=True;User Instance=True" 
 providerName="System.Data.SqlClient"/>
 </connectionStrings> 
 <system.web>
 <membership defaultProvider="SecurityTutorialsSqlMembershipProvider">
 <providers>
 <!--Add a customized SqlMembershipProvider --> 
 <add name="SecurityTutorialsSqlMembershipProvider" 
 type="System.Web.Security.SqlMembershipProvider"
 connectionStringName="SecurityTutorialsConnectionString"
 enablePasswordRetrieval="false"
 enablePasswordReset="true"
 requiresQuestionAndAnswer="true"
 applicationName="SecurityTutorials"
 requiresUniqueEmail="true"
 passwordFormat="Hashed"
 maxInvalidPasswordAttempts="5"
 minRequiredPasswordLength="7"
 minRequiredNonalphanumericCharacters="1"
 passwordAttemptWindow="10"
 passwordStrengthRegularExpression=""/>
 </providers>
 </membership>
 ... Configuration markup removed for brevity ... 
 </system.web>
</configuration>

Oltre alla registrazione del SecurityTutorialsSqlMembershipProvider provider, il markup precedente definisce come SecurityTutorialsSqlMembershipProvider provider predefinito (tramite l'attributo nell'elemento defaultProvider<membership> ). Tenere presente che il framework di appartenenza può avere più provider registrati. Poiché AspNetSqlMembershipProvider è registrato come primo provider in machine.config, funge da provider predefinito, a meno che non si indichi altrimenti.

Attualmente l'applicazione ha due provider registrati: AspNetSqlMembershipProvider e SecurityTutorialsSqlMembershipProvider. Tuttavia, prima di registrare il SecurityTutorialsSqlMembershipProvider provider potrebbe essere stato cancellato tutti i provider registrati in precedenza aggiungendo un <clear /> elemento immediatamente prima dell'elemento <add> . Ciò cancella l'elenco dei provider registrati, ovvero l'unico AspNetSqlMembershipProviderSecurityTutorialsSqlMembershipProvider provider di appartenenza registrato. Se si usa questo approccio, non è necessario contrassegnare come provider predefinito, perché sarebbe l'unico SecurityTutorialsSqlMembershipProvider provider di appartenenza registrato. Per altre informazioni sull'uso di , vedere Uso <clear /><clear /> di quando si aggiungono provider.

Si noti che l'impostazione dell'oggetto connectionStringName fa riferimento al nome di stringa di connessione appena aggiunto SecurityTutorialsConnectionString e che applicationName l'impostazione SecurityTutorialsSqlMembershipProviderè stata impostata su un valore di SecurityTutorials. Inoltre, l'impostazione requiresUniqueEmail è stata impostata su true. Tutte le altre opzioni di configurazione sono identiche ai valori in AspNetSqlMembershipProvider. Se si desidera, è possibile apportare modifiche alla configurazione. Ad esempio, è possibile restringere la forza della password richiedendo due caratteri non alfanumerici anziché uno o aumentando la lunghezza della password a otto caratteri anziché sette.

Nota

Si ricordi che il framework di appartenenza consente di partizionare un singolo archivio utenti tra più applicazioni. L'impostazione del applicationName provider di appartenenza indica l'applicazione usata dal provider quando si usa l'archivio utenti. È importante impostare in modo esplicito un valore per l'impostazione applicationName di configurazione perché se applicationName l'oggetto non è impostato in modo esplicito, viene assegnato al percorso radice virtuale dell'applicazione Web in fase di esecuzione. Ciò funziona correttamente finché il percorso radice virtuale dell'applicazione non cambia, ma se si sposta l'applicazione in un percorso diverso, l'impostazione applicationName cambierà. In questo caso, il provider di appartenenza inizierà a usare una partizione dell'applicazione diversa rispetto a quella usata in precedenza. Gli account utente creati prima dello spostamento si trovano in una partizione diversa dell'applicazione e gli utenti non potranno più accedere al sito. Per una discussione più approfondita su questa questione, vedere Impostare sempre la proprietà quando si configura l'appartenenza applicationName ASP.NET 2.0 e altri provider.

Riepilogo

A questo punto è disponibile un database con i servizi applicazioni configurati (SecurityTutorials.mdf) e l'applicazione Web è stata configurata in modo che il framework di appartenenza usi il SecurityTutorialsSqlMembershipProvider provider appena registrato. Questo provider registrato è di tipo SqlMembershipProvider e ha il connectionStringName relativo set sul stringa di connessione appropriato (SecurityTutorialsConnectionString) e il relativo applicationName valore impostato in modo esplicito.

È ora possibile usare il framework di appartenenza dall'applicazione. Nell'esercitazione successiva verrà illustrato come creare nuovi account utente. Dopo aver esaminato l'autenticazione degli utenti, l'esecuzione dell'autorizzazione basata sull'utente e l'archiviazione di informazioni aggiuntive correlate all'utente nel database.

Programmazione felice!

Altre informazioni

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

Training video sugli argomenti contenuti in questa esercitazione

Informazioni sull'autore

Scott Mitchell, autore di più libri ASP/ASP.NET e fondatore di 4GuysFromRolla.com, ha lavorato con le tecnologie Web Microsoft dal 1998. Scott lavora come consulente indipendente, allenatore e scrittore. Il suo ultimo libro è Sams Teach Yourself ASP.NET 2,0 in 24 Ore. Scott può essere raggiunto all'indirizzo mitchell@4guysfromrolla.com o tramite il suo blog all'indirizzo http://ScottOnWriting.NET.

Grazie speciali

Questa serie di esercitazioni è stata esaminata da molti revisori utili. Il revisore lead per questa esercitazione è Alicja Maziarz. Interessati a esaminare i prossimi articoli MSDN? In tal caso, lasciami una riga in mitchell@4GuysFromRolla.com.