Creazione dello schema di appartenenza in SQL Server (C#)
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.
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.
Figura 2: Il SecurityTutorials
database è attualmente vuoto (fare clic per visualizzare l'immagine full-size)
Passaggio 2: Aggiunta delloSqlMembershipProvider
schema 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
, SqlRoleProvider
insieme 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_Data
cartella
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.
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.
Figura 4: Collegare il database (fare clic per visualizzare l'immagineSecurityTutorials.mdf
full-size)
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.
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.
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.
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\InstanceName
e rinominato SecurityTutorialsDatabase
in , usare i valori seguenti:
- Server:
localhost\InstanceName
- Autenticazione di Windows
- Database:
SecurityTutorialsDatabase
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.
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.sql
InstallProfile.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.
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
, LoweredApplicationName
e 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
, PasswordFormat
e 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_Users
aspnet_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 , Hashed o 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 delleSqlMembershipProvider
impostazioni
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.mdf
SecurityTutorials.mdf
database creato nel passaggio 2. Questa modifica può essere eseguita in uno dei due modi seguenti:
- Specificare un valore per l'oggetto
LocalSqlServer
stringa di connessione nome inWeb.config
. Sovrascrivendo il valore del nome stringa di connessione inWeb.config
, è possibile usare ilLocalSqlServer
provider di appartenenza registrato predefinito (AspNetSqlMembershipProvider
) e usarlo correttamente con ilSecurityTutorials.mdf
database. Questo approccio è corretto se si è contenuti con le impostazioni di configurazione specificate daAspNetSqlMembershipProvider
. 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 tipo
SqlMembershipProvider
e configurare il relativoconnectionStringName
impostazione per puntare all'oggettoSecurityTutorials.mdf
Database. 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 AspNetSqlMembershipProvider
SecurityTutorialsSqlMembershipProvider
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:
- Impostare sempre la
applicationName
proprietà quando si configura ASP.NET 2.0 appartenenza e altri provider - Configurazione di servizi applicazione ASP.NET 2.0 per l'uso di SQL Server 2000 o SQL Server 2005
- Scaricare SQL Server Management Studio
- Esame dell'appartenenza, dei ruoli e del profilo di ASP.NET 2.0
- Elemento per provider per l'appartenenza
<add>
- Elemento
<membership>
- Elemento per l'appartenenza
<providers>
- Uso
<clear />
di quando si aggiungono provider - Uso diretto con l'oggetto
SqlMembershipProvider
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.