Het lidmaatschapsschema maken in SQL Server (C#)
door Scott Mitchell
Notitie
Sinds dit artikel is geschreven, zijn de ASP.NET Lidmaatschapsproviders vervangen door ASP.NET Identity. We raden u ten zeerste aan om apps bij te werken om gebruik te maken van het ASP.NET Identity-platform in plaats van de Membership-providers die op het moment van schrijven in dit artikel werden aanbevolen. ASP.NET Identity heeft een aantal voordelen ten opzichte van het ASP.NET Lidmaatschapssysteem, waaronder:
- Betere prestaties
- Verbeterde uitbreidbaarheid en testbaarheid
- Ondersteuning voor OAuth, OpenID Connect en tweeledige verificatie
- Ondersteuning voor op claims gebaseerde identiteit
- Betere interoperabiliteit met ASP.Net Core
Code downloaden of PDF- downloaden
Deze zelfstudie begint met het onderzoeken van technieken voor het toevoegen van het benodigde schema aan de database om de SqlMembershipProvider te gebruiken. Hierna bekijken we de belangrijkste tabellen in het schema en bespreken we hun doel en urgentie. Deze zelfstudie eindigt met een uitleg over hoe je een ASP.NET applicatie vertelt welke provider door het lidmaatschapsframework moet worden gebruikt.
Introductie
De vorige twee handleidingen onderzochten formulierverificatie om websitebezoekers te identificeren. Met het verificatieframework voor formulieren kunnen ontwikkelaars eenvoudig een gebruiker aanmelden bij een website en deze onthouden tijdens paginabezoeken via het gebruik van verificatietickets. De FormsAuthentication
klasse bevat methoden voor het genereren van het ticket en het toevoegen ervan aan de cookies van de bezoeker. De FormsAuthenticationModule
onderzoekt alle binnenkomende aanvragen en maakt en koppelt voor degenen met een geldig verificatieticket een GenericPrincipal
en een FormsIdentity
-object aan de huidige aanvraag. Formulierverificatie is slechts een mechanisme voor het verlenen van een verificatieticket aan een bezoeker bij het aanmelden en bij volgende aanvragen het parseren van dat ticket om de identiteit van de gebruiker te bepalen. Voor een webtoepassing die ondersteuning biedt voor gebruikersaccounts, moeten we nog steeds een gebruikersarchief implementeren en functionaliteit toevoegen om referenties te valideren, nieuwe gebruikers te registreren en talloze andere taken met betrekking tot gebruikersaccounts te registreren.
Vóór ASP.NET 2.0 waren ontwikkelaars verantwoordelijk voor het implementeren van al deze taken die betrekking hebben op gebruikersaccounts. Gelukkig heeft het ASP.NET team dit tekort herkend en het lidmaatschapsframework geïntroduceerd met ASP.NET 2.0. Het lidmaatschapsframework is een set klassen in .NET Framework die een programmatische interface bieden voor het uitvoeren van kerntaken voor gebruikersaccounts. Dit framework is gebouwd boven op het providermodel, waarmee ontwikkelaars een aangepaste implementatie kunnen aansluiten op een gestandaardiseerde API.
Zoals besproken in de zelfstudie Basisbeginselen van beveiliging en ASP.NET Ondersteuning, wordt het .NET Framework geleverd met twee ingebouwde lidmaatschapsproviders: ActiveDirectoryMembershipProvider
en SqlMembershipProvider
. Zoals de naam al aangeeft, gebruikt de SqlMembershipProvider
een Microsoft SQL Server-database als gebruikersarchief. Als u deze provider in een toepassing wilt gebruiken, moeten we de provider vertellen welke database moet worden gebruikt als de store. Zoals u zich misschien kunt voorstellen, verwacht de SqlMembershipProvider
dat de gebruikersdatabase bepaalde databasetabellen, views en opgeslagen procedures heeft. We moeten dit verwachte schema toevoegen aan de geselecteerde database.
Deze handleiding begint met het onderzoeken van technieken voor het toevoegen van het benodigde schema aan de database voor het gebruik van de SqlMembershipProvider
. Hierna bekijken we de belangrijkste tabellen in het schema en bespreken we hun doel en urgentie. Deze zelfstudie eindigt met een uitleg over hoe te bepalen welke provider het lidmaatschapsframework in een ASP.NET-toepassing moet gebruiken.
Laten we aan de slag gaan.
Stap 1: bepalen waar de gebruikersopslag moet worden geplaatst
De gegevens van een ASP.NET toepassing worden meestal opgeslagen in een aantal tabellen in een database. Bij het implementeren van het SqlMembershipProvider
databaseschema moeten we beslissen of het lidmaatschapsschema in dezelfde database moet worden opgenomen als de toepassingsgegevens of in een alternatieve database.
Ik raad u aan om het lidmaatschapsschema in dezelfde database te zoeken als de toepassingsgegevens om de volgende redenen:
- Onderhoudbaarheid een toepassing waarvan de gegevens zijn ingekapseld in één database gemakkelijker te begrijpen, te onderhouden en te implementeren dan een toepassing met twee afzonderlijke databases.
- Relationele integriteit ' door de lidmaatschapsgerelateerde tabellen in dezelfde database te plaatsen als de toepassingstabellen, is het mogelijk om foreign key-beperkingen vast te stellen tussen de primaire sleutels in de lidmaatschapsgerelateerde tabellen en gerelateerde toepassingstabellen.
Het loskoppelen van de gebruikersopslag en toepassingsgegevens in afzonderlijke databases is alleen zinvol als u meerdere toepassingen hebt die elk afzonderlijke databases gebruiken, maar een gemeenschappelijk gebruikersarchief moeten delen.
Een database maken
De toepassing die we hebben gebouwd sinds de tweede zelfstudie heeft nog geen database nodig. We hebben er nu echter een nodig voor de opslag voor gebruikers. Laten we er een maken en er vervolgens het schema aan toevoegen dat is vereist voor de SqlMembershipProvider
-provider (zie stap 2).
Notitie
In deze reeks zelfstudies gebruiken we een Microsoft SQL Server 2005 Express Edition database om onze toepassingstabellen en het SqlMembershipProvider
schema op te slaan. Deze beslissing is om twee redenen genomen: eerst vanwege de kosten - gratis - de Express Edition is de meest leesbare versie van SQL Server 2005; Ten tweede kunnen SQL Server 2005 Express Edition-databases rechtstreeks in de map App_Data
van de webtoepassing worden geplaatst, waardoor de database en webtoepassing in één ZIP-bestand kunnen worden verpakt en opnieuw kunnen worden geïmplementeerd zonder speciale installatie-instructies of configuratieopties. Als u liever een niet-Express Edition-versie van SQL Server gebruikt, kunt u dit gerust doen. De stappen zijn vrijwel identiek. Het SqlMembershipProvider
schema werkt met elke versie van Microsoft SQL Server 2000 en hoger.
Klik in Solution Explorer met de rechtermuisknop op de map App_Data
en kies ervoor om nieuw item toe te voegen. (Als u geen App_Data
map in uw project ziet, klikt u met de rechtermuisknop op het project in Solution Explorer, selecteert u ASP.NET map toevoegen en kiest u App_Data
.) Kies in het dialoogvenster Nieuw item toevoegen een nieuwe SQL Database met de naam SecurityTutorials.mdf
. In deze zelfstudie voegen we het SqlMembershipProvider
schema toe aan deze database; in de volgende zelfstudies maken we extra tabellen om onze toepassingsgegevens vast te leggen.
afbeelding 1: voeg een nieuwe SQL-database met de naam SecurityTutorials.mdf
database toe aan de map App_Data
(Klik om de volledige afbeelding weer te geven)
Als u een database toevoegt aan de map App_Data
, wordt deze automatisch opgenomen in de databaseverkennerweergave. (In de niet-Express Edition-versie van Visual Studio wordt Database Explorer de Server Explorer genoemd.) Ga naar Database Explorer en vouw de zojuist toegevoegde SecurityTutorials
-database uit. Als u databaseverkenner niet op het scherm ziet, gaat u naar het menu Beeld en kiest u Databaseverkenner of drukt u op Ctrl+Alt+S. Zoals in afbeelding 2 wordt weergegeven, is de SecurityTutorials
database leeg. De database bevat geen tabellen, geen weergaven en geen opgeslagen procedures.
afbeelding 2: de SecurityTutorials
database is momenteel leeg (klikklik om de volledige afbeelding weer te geven)
Stap 2: hetSqlMembershipProvider
schema toevoegen aan de database
Voor de SqlMembershipProvider
moet een bepaalde set tabellen, weergaven en opgeslagen procedures worden geïnstalleerd in de gebruikersopslagdatabase. Deze vereiste databaseobjecten kunnen worden toegevoegd met behulp van het hulpprogramma aspnet_regsql.exe
. Dit bestand bevindt zich in de map %WINDIR%\Microsoft.Net\Framework\v2.0.50727\
.
Notitie
Het hulpprogramma aspnet_regsql.exe
biedt zowel opdrachtregelfunctionaliteit als een grafische gebruikersinterface. De grafische interface is gebruiksvriendelijker en is wat we in deze zelfstudie gaan onderzoeken. De opdrachtregelinterface is handig wanneer het toevoegen van het SqlMembershipProvider
schema moet worden geautomatiseerd, zoals in buildscripts of geautomatiseerde testscenario's.
Het hulpprogramma aspnet_regsql.exe
wordt gebruikt om ASP.NET toepassingsservices toe te voegen of te verwijderen aan een opgegeven SQL Server-database. De ASP.NET toepassingsservices omvatten de schema's voor de SqlMembershipProvider
en SqlRoleProvider
, samen met de schema's voor de SQL-providers voor andere ASP.NET 2.0-frameworks. We moeten twee stukjes informatie verstrekken aan het hulpprogramma aspnet_regsql.exe
:
- Of we nu toepassingsservices willen toevoegen of verwijderen, en
- De database waaruit het schema voor toepassingsservices moet worden toegevoegd of verwijderd
Als u wordt gevraagd om de database te gebruiken, vraagt het hulpprogramma aspnet_regsql.exe
ons om de naam op te geven van de server waarop de database zich bevindt, de beveiligingsreferenties voor het maken van verbinding met de database en de databasenaam. Als u de niet-Express Edition van SQL Server gebruikt, moet u deze informatie al weten, omdat dit dezelfde informatie is die u moet opgeven via een verbindingsreeks wanneer u met de database werkt via een ASP.NET webpagina. Het bepalen van de server- en databasenaam bij het gebruik van een SQL Server 2005 Express Edition-database in de map App_Data
is iets ingewikkelder.
In de volgende sectie wordt een eenvoudige manier onderzocht voor het opgeven van de server- en databasenaam voor een SQL Server 2005 Express Edition-database in de map App_Data
. Als u SQL Server 2005 Express Edition niet gebruikt, kunt u verdergaan met de sectie Application Services installeren.
De server- en databasenaam voor een SQL Server 2005 Express Edition-database bepalen in de mapApp_Data
Als u het hulpprogramma aspnet_regsql.exe
wilt gebruiken, moeten we de server- en databasenamen kennen. De servernaam is localhost\InstanceName
. Waarschijnlijk is de InstanceNameSQLExpress
. Als u SQL Server 2005 Express Edition echter handmatig hebt geïnstalleerd (dat wil zeggen dat u deze niet automatisch hebt geïnstalleerd tijdens het installeren van Visual Studio), is het mogelijk dat u een andere exemplaarnaam hebt geselecteerd.
De databasenaam is wat lastiger om te bepalen. Databases in de map App_Data
hebben doorgaans een databasenaam met een globally unique identifier samen met het pad naar het databasebestand. We moeten deze databasenaam bepalen om het schema van de toepassingsservices toe te voegen via aspnet_regsql.exe
.
De eenvoudigste manier om de databasenaam te controleren, is door deze te onderzoeken via SQL Server Management Studio. SQL Server Management Studio biedt een grafische interface voor het beheren van SQL Server 2005-databases, maar wordt niet geleverd met de Express Edition van SQL Server 2005. Het goede nieuws is dat u de gratis Express Edition van SQL Server Management Studio kunt downloaden.
Notitie
Als u ook een niet-Express Edition-versie van SQL Server 2005 op uw bureaublad hebt geïnstalleerd, is de volledige versie van Management Studio waarschijnlijk geïnstalleerd. U kunt de volledige versie gebruiken om de databasenaam te bepalen, volgens dezelfde stappen als hieronder beschreven voor de Express Edition.
Sluit Eerst Visual Studio om ervoor te zorgen dat eventuele vergrendelingen die door Visual Studio in het databasebestand worden opgelegd, worden gesloten. Start vervolgens SQL Server Management Studio en maak verbinding met de localhost\InstanceName
-database voor SQL Server 2005 Express Edition. Zoals eerder vermeld, is de kans groot dat de naam van het exemplaar SQLExpress
is. Voor de optie Authenticatie selecteer Windows-verificatie.
Afbeelding 3: maak verbinding met het exemplaar van de Express-editie van SQL Server 2005 (Klik om de volledige afbeelding weer te geven)
Nadat u verbinding hebt gemaakt met het EXEMPLAAR van SQL Server 2005 Express Edition, worden in Management Studio mappen weergegeven voor de databases, de beveiligingsinstellingen, de serverobjecten enzovoort. Als u het tabblad Databases uitvouwt, ziet u dat de SecurityTutorials.mdf
database niet geregistreerd is in het database-exemplaar - we moeten de database eerst koppelen.
Klik met de rechtermuisknop op de map Databases en kies Bijvoegen in het contextmenu. Hiermee wordt het dialoogvenster Databases bijvoegen weergegeven. Klik hier op de knop Toevoegen, blader naar de SecurityTutorials.mdf
-database en klik op OK. In afbeelding 4 ziet u het dialoogvenster Databases bijvoegen nadat de SecurityTutorials.mdf
database is geselecteerd. In afbeelding 5 ziet u objectverkenner van Management Studio nadat de database is gekoppeld.
Afbeelding 4: Koppel de database SecurityTutorials.mdf
(Klik om de volledige afbeelding weer te geven)
Afbeelding 5: De SecurityTutorials.mdf
database verschijnt in de map Databases (klik om de afbeelding op volledige grootte weer te geven)
Zoals in afbeelding 5 wordt weergegeven, heeft de SecurityTutorials.mdf
database een nogal abstruse-naam. Laten we deze wijzigen in een meer gedenkwaardige naam (en gemakkelijker te typen). Klik met de rechtermuisknop op de database, kies Naam wijzigen in het contextmenu en wijzig de naam SecurityTutorialsDatabase
. Hierdoor wordt de bestandsnaam niet gewijzigd, alleen de naam die de database gebruikt om zichzelf te identificeren bij SQL Server.
Afbeelding 6: wijzig de naam van de database in SecurityTutorialsDatabase
(klik om de volledige afbeelding weer te geven)
Op dit punt kennen we de server- en databasenamen voor het SecurityTutorials.mdf
databasebestand: respectievelijk localhost\InstanceName
en SecurityTutorialsDatabase
. We zijn nu klaar om de toepassingsservices te installeren via het hulpprogramma aspnet_regsql.exe
.
Het installeren van de Applicatiediensten
Als u het hulpprogramma aspnet_regsql.exe
wilt starten, gaat u naar het startmenu en kiest u Uitvoeren. Voer %WINDIR%\Microsoft.Net\Framework\v2.0.50727\aspnet_regsql.exe
in het tekstvak in en klik op OK. U kunt Windows Verkenner ook gebruiken om in te zoomen op de juiste map en te dubbelklikken op het aspnet_regsql.exe
-bestand. Beide benaderingen zullen dezelfde resultaten opleveren.
Als u het hulpprogramma aspnet_regsql.exe
zonder opdrachtregelargumenten uitvoert, wordt de grafische gebruikersinterface van de ASP.NET sql Server-installatiewizard gestart. Met de wizard kunt u eenvoudig de ASP.NET toepassingsservices toevoegen aan of verwijderen uit een opgegeven database. In het eerste scherm van de wizard, weergegeven in afbeelding 7, wordt het doel van het hulpprogramma beschreven.
Afbeelding 7: Gebruik de ASP.NET SQL Server Setup Wizard om het lidmaatschapschema toe te voegen (Klik om de volledige afbeelding weer te geven)
De tweede stap in de wizard vraagt ons of we de toepassingsservices willen toevoegen of verwijderen. Omdat we de tabellen, weergaven en opgeslagen procedures willen toevoegen die nodig zijn voor de SqlMembershipProvider
, kiest u de optie SQL Server configureren voor toepassingsservices. Als u dit schema later uit uw database wilt verwijderen, voert u deze wizard opnieuw uit, maar kiest u in plaats daarvan de gegevens van toepassingsservices verwijderen uit een bestaande databaseoptie.
afbeelding 8: kies de optie SQL Server configureren voor Application Services (klikklik om de volledige afbeelding weer te geven)
In de derde stap wordt om de databasegegevens gevraagd: de servernaam, verificatiegegevens en de databasenaam. Als u deze zelfstudie hebt gevolgd en de SecurityTutorials.mdf
-database hebt toegevoegd aan App_Data
, deze hebt gekoppeld aan localhost\InstanceName
en de naam ervan hebt gewijzigd in SecurityTutorialsDatabase
, gebruikt u de volgende waarden:
- Server:
localhost\InstanceName
- Windows-verificatie
- Database:
SecurityTutorialsDatabase
afbeelding 9: voer de databasegegevens in (klik om de volledige afbeelding weer te geven)
Nadat u de databasegegevens hebt ingevoerd, klikt u op Volgende. De laatste stap bevat een overzicht van de stappen die worden uitgevoerd. Klik op Volgende om de toepassingsservices te installeren en vervolgens Voltooien om de wizard te voltooien.
Notitie
Als u Management Studio hebt gebruikt om de database te koppelen en de naam van het databasebestand te wijzigen, moet u de database loskoppelen en Management Studio sluiten voordat u Visual Studio opnieuw opent. Als u de SecurityTutorialsDatabase
database wilt loskoppelen, klikt u met de rechtermuisknop op de databasenaam en kiest u in het menu Taken de optie Loskoppelen.
Wanneer de wizard is voltooid, gaat u terug naar Visual Studio en gaat u naar Database Explorer. Vouw de map Tabellen uit. U ziet nu een reeks tabellen waarvan de namen beginnen met het voorvoegsel aspnet_
. Op dezelfde manier vindt u een verscheidenheid aan weergaven en opgeslagen procedures in de mappen Weergaven en Opgeslagen procedures. Deze databaseobjecten vormen het schema van de toepassingsservices. In stap 3 bekijken we de lidmaatschaps- en rolspecifieke databaseobjecten.
afbeelding 10: Er zijn verschillende tabellen, weergaven en opgeslagen procedures toegevoegd aan de database (Klik om de volledige afbeelding weer te geven)
Notitie
De grafische gebruikersinterface van het aspnet_regsql.exe
-hulpprogramma installeert het volledige schema voor toepassingsservices. Maar bij het uitvoeren van aspnet_regsql.exe
vanaf de opdrachtregel kunt u opgeven welke onderdelen van de toepassingsservices u wilt installeren (of verwijderen). Als u daarom alleen de tabellen, weergaven en opgeslagen procedures wilt toevoegen die nodig zijn voor de SqlMembershipProvider
- en SqlRoleProvider
-providers, voert u aspnet_regsql.exe
uit vanaf de opdrachtregel. U kunt ook handmatig de juiste subset van T-SQL-createscripts uitvoeren die door aspnet_regsql.exe
worden gebruikt. Deze scripts bevinden zich in de map WINDIR%\Microsoft.Net\Framework\v2.0.50727\
met namen zoals InstallCommon.sql
,InstallMembership.sql
,InstallRoles.sql
, InstallProfile.sql
,InstallSqlState.sql
enzovoort.
Op dit moment hebben we de databaseobjecten gemaakt die nodig zijn voor de SqlMembershipProvider
. We moeten echter nog steeds het lidmaatschapsframework instrueren dat het de SqlMembershipProvider
(versus de ActiveDirectoryMembershipProvider
) moet gebruiken en dat de SqlMembershipProvider
de SecurityTutorials
-database moet gebruiken. In stap 4 wordt uitgelegd hoe u opgeeft welke provider moet worden gebruikt en hoe u de instellingen van de geselecteerde provider aanpast. Maar eerst gaan we dieper in op de databaseobjecten die zojuist zijn gemaakt.
Stap 3: Een overzicht van de kerntabellen van het schema
Wanneer u werkt met de frameworks Lidmaatschap en Rollen in een ASP.NET-toepassing, worden de implementatiedetails ingekapseld door de provider. In toekomstige zelfstudies maken we een interface met deze frameworks via de Membership
en Roles
klassen van .NET Framework. Wanneer u deze API's op hoog niveau gebruikt, hoeven we ons niet bezig te houden met de details op laag niveau, zoals welke query's worden uitgevoerd of welke tabellen worden gewijzigd door de SqlMembershipProvider
en SqlRoleProvider
.
Op basis hiervan kunnen we de frameworks lidmaatschap en rollen met vertrouwen gebruiken zonder dat we het databaseschema hebben verkend dat in stap 2 is gemaakt. Wanneer u echter de tabellen maakt om toepassingsgegevens op te slaan, moeten we mogelijk entiteiten maken die betrekking hebben op gebruikers of rollen. Het helpt om vertrouwd te zijn met de SqlMembershipProvider
- en SqlRoleProvider
-schema's bij het instellen van restricties voor referentiesleutels tussen de tabellen met toepassingsgegevens en die tabellen die zijn gemaakt in stap 2. Bovendien moeten we in bepaalde zeldzame gevallen rechtstreeks met de gebruikers- en rolarchieven op databaseniveau (in plaats van via de Membership
- of Roles
klassen) interfacen.
Partitioneren van het gebruikersarchief in toepassingen
De frameworks lidmaatschap en rollen zijn zodanig ontworpen dat één gebruikers- en rolarchief kan worden gedeeld tussen veel verschillende toepassingen. Een ASP.NET-toepassing die gebruikmaakt van de frameworks Lidmaatschap of Rollen, moet opgeven welke toepassingspartitie moet worden gebruikt. Kortom, meerdere webtoepassingen kunnen dezelfde gebruikers- en rolarchieven gebruiken. Afbeelding 11 toont gebruikers- en rolarchieven die zijn gepartitioneerd in drie toepassingen: HRSite, CustomerSite en SalesSite. Deze drie webtoepassingen hebben elk hun eigen unieke gebruikers en rollen, maar ze slaan allemaal hun gebruikersaccount en rolgegevens fysiek op in dezelfde databasetabellen.
afbeelding 11: Gebruikersaccounts kunnen worden gepartitioneerd in meerdere toepassingen (Klik om de afbeelding op volledige grootte weer te geven)
De aspnet_Applications
tabel definieert deze partities. Elke toepassing die gebruikmaakt van de database voor het opslaan van gebruikersaccountgegevens, wordt vertegenwoordigd door een rij in deze tabel. De tabel aspnet_Applications
heeft vier kolommen: ApplicationId
, ApplicationName
, LoweredApplicationName
en Description
.
ApplicationId
is van het type uniqueidentifier
en is de primaire sleutel van de tabel; ApplicationName
biedt een unieke, mensvriendelijke naam voor elke toepassing.
De andere Lidmaatschaps- en Rolgerelateerde tabellen verwijzen terug naar het ApplicationId
veld in aspnet_Applications
. De aspnet_Users
-tabel, die een record voor elk gebruikersaccount bevat, heeft bijvoorbeeld een veld met een ApplicationId
buitenlandse sleutel; hetzelfde geldt voor de tabel aspnet_Roles
. Het veld ApplicationId
in deze tabellen specificeert de toepassingspartitie waartoe het gebruikersaccount of de rol behoort.
Gebruikersaccountgegevens opslaan
Gebruikersaccountgegevens zijn ondergebracht in twee tabellen: aspnet_Users
en aspnet_Membership
. De tabel aspnet_Users
bevat velden met de essentiële gebruikersaccountgegevens. De drie meest relevante kolommen zijn:
UserId
UserName
ApplicationId
UserId
is de primaire sleutel (en van het type uniqueidentifier
).
UserName
is van het type nvarchar(256)
en, samen met het wachtwoord, vormt het de referenties van de gebruiker. (Het wachtwoord van een gebruiker wordt opgeslagen in de aspnet_Membership
tabel.) ApplicationId
koppelt het gebruikersaccount aan een bepaalde toepassing in aspnet_Applications
. Er is een samengestelde beperking UNIQUE
op de kolommen UserName
en ApplicationId
. Dit zorgt ervoor dat elke username in een bepaalde toepassing uniek is, maar dat hetzelfde UserName
in verschillende toepassingen kan worden gebruikt.
De aspnet_Membership
tabel bevat aanvullende gebruikersaccountgegevens, zoals het wachtwoord van de gebruiker, het e-mailadres, de laatste aanmeldingsdatum en -tijd, enzovoort. Er is een een-op-een-correspondentie tussen records in de aspnet_Users
en aspnet_Membership
tabellen. Deze relatie wordt gegarandeerd door het veld UserId
in aspnet_Membership
, dat fungeert als de primaire sleutel van de tabel. Net als in de aspnet_Users
tabel bevat aspnet_Membership
een ApplicationId
veld dat deze informatie koppelt aan een bepaalde toepassingspartitie.
Wachtwoorden beveiligen
Wachtwoordgegevens worden opgeslagen in de aspnet_Membership
tabel. Met de SqlMembershipProvider
kunnen wachtwoorden in de database worden opgeslagen met behulp van een van de volgende drie technieken:
- Klar: het wachtwoord wordt opgeslagen in de database als platte tekst. Ik raad het gebruik van deze optie sterk af. Als de database is gecompromitteerd - of het nu is door een hacker die een achterdeur vindt of een ontevreden werknemer die databasetoegang heeft - zijn de referenties van elke gebruiker er voor het grijpen.
- Gehashte: wachtwoorden worden gehasht met behulp van een eenrichtings-hashalgoritme en een willekeurig gegenereerde zoutwaarde. Deze gehashte waarde (samen met het zout) wordt opgeslagen in de database.
- Encrypted - een versleutelde versie van het wachtwoord wordt opgeslagen in de database.
De gebruikte wachtwoordopslagtechniek is afhankelijk van de SqlMembershipProvider
instellingen die zijn opgegeven in Web.config
. We kijken naar het aanpassen van de SqlMembershipProvider
-instellingen in stap 4. Het standaardgedrag is het opslaan van de hash van het wachtwoord.
De kolommen die verantwoordelijk zijn voor het opslaan van het wachtwoord zijn Password
, PasswordFormat
en PasswordSalt
.
PasswordFormat
is een veld van het type int
waarvan de waarde aangeeft welke techniek wordt gebruikt voor het opslaan van het wachtwoord: 0 voor Heldere tekst; 1 voor Gehasht; 2 voor Versleuteld.
PasswordSalt
wordt een willekeurig gegenereerde tekenreeks toegewezen, ongeacht de gebruikte techniek voor wachtwoordopslag; de waarde van PasswordSalt
wordt alleen gebruikt bij het berekenen van de hash van het wachtwoord. Ten slotte bevat de kolom Password
de werkelijke wachtwoordgegevens, of het nu het wachtwoord zonder opmaak, de hash van het wachtwoord of het versleutelde wachtwoord.
In tabel 1 ziet u hoe deze drie kolommen eruit kunnen zien voor de verschillende opslagtechnieken bij het opslaan van het wachtwoord MySecret. .
Opslagtechniek<_o3a_p /> | wachtwoord<_o3a_p/> | PasswordFormat<_o3a_p/> | PasswordSalt<_o3a_p/> |
---|---|---|---|
Duidelijk | MySecret! | 0 | tTnkPlesqissc2y2SMEygA== |
Gehashed | 2oXm6sZHWbTHFgjgkGQsc2Ec9ZM= | 1 | wFgjUfhdUFOCKQiI61vtiQ== |
Gecodeerde | 62RZgDvhxykkqsMchZ0Yly7HS6onhpaoCYaRxV8g0F4CW56OXUU3e7Inza9j9BKp | 2 | LSRzhGS/aa/oqAXGLHJNBw== |
tabel 1: voorbeeldwaarden voor de Password-Related velden bij het opslaan van het wachtwoord MySecret!
Notitie
Het specifieke versleutelings- of hash-algoritme dat door de SqlMembershipProvider
wordt gebruikt, wordt bepaald door de instellingen in het <machineKey>
-element.
Rollen en rolassociaties opslaan
Met het rollenframework kunnen ontwikkelaars een set rollen definiëren en opgeven welke gebruikers tot welke rollen behoren. Deze informatie wordt vastgelegd in de database via twee tabellen: aspnet_Roles
en aspnet_UsersInRoles
. Elke record in de tabel aspnet_Roles
vertegenwoordigt een rol voor een bepaalde toepassing. Net als de aspnet_Users
tabel heeft de aspnet_Roles
tabel drie kolommen die relevant zijn voor onze discussie:
RoleId
RoleName
ApplicationId
RoleId
is de primaire sleutel (en van het type uniqueidentifier
).
RoleName
is van het type nvarchar(256)
. En ApplicationId
koppelt het gebruikersaccount aan een bepaalde toepassing in aspnet_Applications
. Er is een samengestelde UNIQUE
beperking voor de kolommen RoleName
en ApplicationId
, zodat elke rolnaam in een bepaalde toepassing uniek is.
De tabel aspnet_UsersInRoles
dient als een koppeling tussen gebruikers en rollen. Er zijn slechts twee kolommen, UserId
en RoleId
, samen vormen ze een samengestelde primaire sleutel.
Stap 4: de provider opgeven en de bijbehorende instellingen aanpassen
Alle frameworks die ondersteuning bieden voor het providermodel, zoals het lidmaatschaps- en rollenframework, ontbreken zelf implementatiedetails en delegeren die verantwoordelijkheid voor een providerklasse. In het geval van het lidmaatschapsframework definieert de Membership
klasse de API voor het beheren van gebruikersaccounts, maar deze werkt niet rechtstreeks met een gebruikersarchief. In plaats daarvan geven de methoden van de Membership
-klasse de aanvraag af aan de geconfigureerde provider. We gebruiken de SqlMembershipProvider
. Wanneer we een van de methoden in de Membership
-klasse aanroepen, hoe weet het lidmaatschapsframework de aanroep naar de SqlMembershipProvider
te delegeren?
De Membership
-klasse heeft een Providers
eigenschap die een verwijzing bevat naar alle geregistreerde providerklassen die beschikbaar zijn voor gebruik door het lidmaatschapsframework. Elke geregistreerde provider heeft een bijbehorende naam en type. De naam biedt een mensvriendelijke manier om te verwijzen naar een bepaalde provider in de Providers
verzameling, terwijl het type de providerklasse identificeert. Bovendien kan elke geregistreerde provider configuratie-instellingen bevatten. Configuratie-instellingen voor het lidmaatschapsframework omvatten onder andere passwordFormat
en requiresUniqueEmail
. Zie tabel 2 voor een volledige lijst met configuratie-instellingen die door de SqlMembershipProvider
worden gebruikt.
De inhoud van de Providers
eigenschap wordt opgegeven via de configuratie-instellingen van de webtoepassing. Standaard hebben alle webtoepassingen een provider met de naam AspNetSqlMembershipProvider
van het type SqlMembershipProvider
. Deze standaardlidmaatschapsprovider is geregistreerd in machine.config
(op %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG)
:
Waarschuwing
Het lijkt erop dat het voorbeeld dat u zoekt, is verplaatst. Wees gerust dat we aan het oplossen hiervan werken.
Zoals hierboven wordt weergegeven, definieert het <membership>
element de configuratie-instellingen voor het lidmaatschapsframework, terwijl het <providers>
onderliggende element de geregistreerde providers specificeert. Providers kunnen worden toegevoegd of verwijderd met behulp van de <add>
- of <remove>
-elementen; gebruik het element <clear>
om alle momenteel geregistreerde providers te verwijderen. Zoals in de bovenstaande markeringen wordt weergegeven, voegt machine.config
een provider toe met de naam AspNetSqlMembershipProvider
van het type SqlMembershipProvider
.
Naast de kenmerken name
en type
bevat het element <add>
kenmerken waarmee de waarden voor verschillende configuratie-instellingen worden gedefinieerd. Tabel 2 bevat de beschikbare SqlMembershipProvider
-specifieke configuratie-instellingen, samen met een beschrijving van elk.
Notitie
Alle standaardwaarden die in tabel 2 worden vermeld, verwijzen naar de standaardwaarden die zijn gedefinieerd in de klasse SqlMembershipProvider
. Houd er rekening mee dat niet alle configuratie-instellingen in AspNetSqlMembershipProvider
overeenkomen met de standaardwaarden van de SqlMembershipProvider
-klasse. Als deze bijvoorbeeld niet is opgegeven in een Lidmaatschapsprovider, heeft de requiresUniqueEmail
-instelling standaard de waarde true. De AspNetSqlMembershipProvider
overschrijft deze standaardwaarde echter door expliciet een waarde van false
op te geven.
<_o3a_p/> instellen | Beschrijving<_o3a_p/> |
---|---|
ApplicationName |
Denk eraan dat het lidmaatschapsframework toestaat dat één gebruikersarchief kan worden gepartitioneerd in meerdere toepassingen. Deze instelling geeft de naam aan van de toepassingspartitie die wordt gebruikt door de lidmaatschapsprovider. Als deze waarde niet expliciet is opgegeven, wordt deze tijdens runtime ingesteld op de waarde van het virtuele hoofdpad van de toepassing. |
commandTimeout |
Hiermee geeft u de time-outwaarde van de SQL-opdracht op (in seconden). De standaardwaarde is 30. |
connectionStringName |
De naam van de verbindingsreeks in het <connectionStrings> -element dat moet worden gebruikt om verbinding te maken met de database van het gebruikersarchief. Deze waarde is vereist. |
description |
Biedt een mensvriendelijke beschrijving van de geregistreerde provider. |
enablePasswordRetrieval |
Hiermee geeft u op of gebruikers hun vergeten wachtwoord kunnen ophalen. De standaardwaarde is false . |
enablePasswordReset |
Hiermee wordt aangegeven of gebruikers hun wachtwoord opnieuw mogen instellen. Standaard ingesteld op true . |
maxInvalidPasswordAttempts |
Het maximum aantal mislukte aanmeldingspogingen dat kan optreden voor een bepaalde gebruiker tijdens de opgegeven passwordAttemptWindow voordat de gebruiker wordt vergrendeld. De standaardwaarde is 5. |
minRequiredNonalphanumericCharacters |
Het minimale aantal niet-alfanumerieke tekens dat moet worden weergegeven in het wachtwoord van een gebruiker. Deze waarde moet tussen 0 en 128 zijn; de standaardwaarde is 1. |
minRequiredPasswordLength |
Het minimale aantal tekens dat is vereist in een wachtwoord. Deze waarde moet tussen 0 en 128 zijn; de standaardwaarde is 7. |
name |
De naam van de geregistreerde provider. Deze waarde is vereist. |
passwordAttemptWindow |
Het aantal minuten waarin mislukte aanmeldingspogingen worden bijgehouden. Als een gebruiker ongeldige aanmeldingsreferenties opgeeft maxInvalidPasswordAttempts tijden binnen dit opgegeven venster, zijn deze vergrendeld. De standaardwaarde is 10. |
PasswordFormat |
De indeling voor wachtwoordopslag: Clear , Hashed of Encrypted . De standaardwaarde is Hashed . |
passwordStrengthRegularExpression |
Indien opgegeven, wordt deze reguliere expressie gebruikt om de sterkte van het geselecteerde wachtwoord van de gebruiker te evalueren bij het maken van een nieuw account of bij het wijzigen van hun wachtwoord. De standaardwaarde is een lege tekenreeks. |
requiresQuestionAndAnswer |
Hiermee geeft u op of een gebruiker zijn beveiligingsvraag moet beantwoorden bij het ophalen of opnieuw instellen van zijn wachtwoord. De standaardwaarde is true . |
requiresUniqueEmail |
Geeft aan of alle gebruikersaccounts in een bepaalde toepassingspartitie een uniek e-mailadres moeten hebben. De standaardwaarde is true . |
type |
Hiermee geeft u het type van de provider. Deze waarde is vereist. |
tabel 2: lidmaatschap en SqlMembershipProvider
configuratie-instellingen
Naast AspNetSqlMembershipProvider
kunnen andere lidmaatschapsproviders per toepassing worden geregistreerd door vergelijkbare markeringen toe te voegen aan het Web.config
-bestand.
Notitie
Het rollenframework werkt op ongeveer dezelfde manier: er is een standaardprovider voor geregistreerde rollen in machine.config
en de geregistreerde providers kunnen worden aangepast op basis van een toepassing per toepassing in Web.config
. In een toekomstige zelfstudie bekijken we het rollenframework en de bijbehorende configuratiemarkeringen in detail.
DeSqlMembershipProvider
-instellingen aanpassen
De standaard-SqlMembershipProvider
(AspNetSqlMembershipProvider
) heeft het connectionStringName
kenmerk ingesteld op LocalSqlServer
. Net als de AspNetSqlMembershipProvider
-provider wordt de naam van de verbindingsreeks LocalSqlServer
gedefinieerd in machine.config
.
Waarschuwing
Het lijkt erop dat het voorbeeld dat u zoekt, is verplaatst. Wees gerust dat we aan het oplossen hiervan werken.
Zoals u kunt zien, definieert deze verbindingsreeks een SQL 2005 Express Edition-database op |DataDirectory|aspnetdb.mdf'. De tekenreeks |DataDirectory | wordt tijdens runtime vertaald om naar de ~/App_Data/
map te verwijzen, zodat het databasepad |DataDirectory|aspnetdb.mdf" wordt omgezet in ~/App_Data
/aspnet.mdf
.
Als we geen lidmaatschapsprovidergegevens hebben opgegeven in het Web.config
-bestand van onze toepassing, gebruikt de toepassing de standaard geregistreerde lidmaatschapsprovider, AspNetSqlMembershipProvider
. Als de ~/App_Data/aspnet.mdf
-database niet bestaat, maakt de ASP.NET runtime deze automatisch en voegt u het schema van de toepassingsservices toe. We willen echter niet de aspnet.mdf
-database gebruiken; in plaats daarvan willen we de SecurityTutorials.mdf
database gebruiken die we in stap 2 hebben gemaakt. Deze wijziging kan op twee manieren worden uitgevoerd:
-
Geef een waarde op voor de naam van de
LocalSqlServer
verbindingsreeks inWeb.config
. Door de naamwaarde van deLocalSqlServer
verbindingsreeks inWeb.config
te overschrijven, kunnen we de standaard geregistreerde lidmaatschapsprovider (AspNetSqlMembershipProvider
) gebruiken en deze correct laten werken met deSecurityTutorials.mdf
-database. Deze aanpak is prima als u tevreden bent met de configuratie-instellingen die zijn opgegeven doorAspNetSqlMembershipProvider
. Zie blogpost van Scott Guthrieblogbericht Configuring ASP.NET 2.0 Application Services to Use SQL Server 2000 or SQL Server 2005voor meer informatie over deze techniek. -
Een nieuwe geregistreerde provider van het type
SqlMembershipProvider
toevoegen en deconnectionStringName
-instelling zo configureren dat deze verwijst naar deSecurityTutorials.mdf
-database. Deze benadering is handig in scenario's waarin u andere configuratie-eigenschappen wilt aanpassen naast de databaseverbindingsreeks. In mijn eigen projecten gebruik ik deze aanpak altijd vanwege zijn flexibiliteit en leesbaarheid.
Voordat we een nieuwe geregistreerde provider kunnen toevoegen die verwijst naar de SecurityTutorials.mdf
-database, moeten we eerst een geschikte verbindingsreekswaarde toevoegen aan de sectie <connectionStrings>
in Web.config
. Met de volgende markeringen wordt een nieuwe verbindingsreeks met de naam SecurityTutorialsConnectionString
toegevoegd die verwijst naar de SQL Server 2005 Express Edition SecurityTutorials.mdf
-database in de map App_Data
.
Waarschuwing
Het lijkt erop dat het voorbeeld dat u zoekt, is verplaatst. Wees gerust dat we aan het oplossen hiervan werken.
Notitie
Als u een alternatief databasebestand gebruikt, werkt u de verbindingsreeks indien nodig bij. Raadpleeg ConnectionStrings.comvoor meer informatie over het vormen van de juiste verbindingsreeks.
Voeg vervolgens de volgende lidmaatschapsconfiguratiemarkeringen toe aan het Web.config
-bestand. Met deze markering wordt een nieuwe provider met de naam SecurityTutorialsSqlMembershipProvider
geregistreerd.
Waarschuwing
Het lijkt erop dat het voorbeeld dat u zoekt, is verplaatst. Wees gerust dat we aan het oplossen hiervan werken.
Naast het registreren van de SecurityTutorialsSqlMembershipProvider
-provider definieert de bovenstaande markering de SecurityTutorialsSqlMembershipProvider
als de standaardprovider (via het kenmerk defaultProvider
in het <membership>
-element). Denk eraan dat het lidmaatschapsframework meerdere geregistreerde providers kan hebben. Aangezien AspNetSqlMembershipProvider
is geregistreerd als de eerste provider in machine.config
, dient deze als de standaardprovider, tenzij anders wordt aangegeven.
Op dit moment heeft onze toepassing twee geregistreerde providers: AspNetSqlMembershipProvider
en SecurityTutorialsSqlMembershipProvider
. Voordat u de SecurityTutorialsSqlMembershipProvider
provider registreert, kunnen we echter alle eerder geregistreerde providers hebben gewist door een <clear />
element toe te voegen direct voor ons <add>
element. Dit zou de AspNetSqlMembershipProvider
uit de lijst met geregistreerde providers verwijderen, wat betekent dat de SecurityTutorialsSqlMembershipProvider
de enige geregistreerde lidmaatschapsprovider zou zijn. Als we deze methode hebben gebruikt, hoeven we de SecurityTutorialsSqlMembershipProvider
niet te markeren als de standaardprovider, omdat dit de enige geregistreerde lidmaatschapsprovider zou zijn. Zie Gebruik van <clear />
Bij het Toevoegen van Providersvoor meer informatie over het gebruik van <clear />
.
Houd er rekening mee dat de connectionStringName
-instelling van het SecurityTutorialsSqlMembershipProvider
verwijst naar de naam van de zojuist toegevoegde SecurityTutorialsConnectionString
verbindingsreeks en dat de applicationName
-instelling is ingesteld op een waarde van SecurityTutorials. Daarnaast is de instelling requiresUniqueEmail
ingesteld op true
. Alle andere configuratieopties zijn identiek aan de waarden in AspNetSqlMembershipProvider
. U kunt hier desgewenst configuratiewijzigingen aanbrengen. U kunt bijvoorbeeld de wachtwoordsterkte vergroten door twee niet-alfanumerieke tekens te vereisen in plaats van één, of door de wachtwoordlengte te verhogen tot acht tekens in plaats van zeven.
Notitie
Denk eraan dat het lidmaatschapsframework toestaat dat één gebruikersarchief kan worden gepartitioneerd in meerdere toepassingen. De applicationName
-instelling van de lidmaatschapsprovider geeft aan welke toepassing de provider gebruikt bij het werken met het gebruikersarchief. Het is belangrijk dat u expliciet een waarde instelt voor de applicationName
-configuratie-instelling. Als de applicationName
niet expliciet is ingesteld, wordt deze tijdens runtime toegewezen aan het virtuele hoofdpad van de webtoepassing. Dit werkt prima zolang het virtuele hoofdpad van de toepassing niet verandert, maar als u de toepassing naar een ander pad verplaatst, wordt de instelling applicationName
ook gewijzigd. Wanneer dit gebeurt, werkt de lidmaatschapsprovider met een andere toepassingspartitie dan eerder is gebruikt. Gebruikersaccounts die vóór de verplaatsing zijn gemaakt, bevinden zich in een andere toepassingspartitie en die gebruikers kunnen zich niet meer aanmelden bij de site. Zie Altijd de eigenschap applicationName
instellen bij het configureren van ASP.NET 2.0-lidmaatschap en andere providersvoor een uitgebreidere bespreking hierover.
Samenvatting
Op dit moment hebben we een database met de geconfigureerde toepassingsservices (SecurityTutorials.mdf
) en hebben we onze webtoepassing geconfigureerd, zodat het lidmaatschapsframework gebruikmaakt van de SecurityTutorialsSqlMembershipProvider
provider die we zojuist hebben geregistreerd. Deze geregistreerde provider is van het type SqlMembershipProvider
en heeft de bijbehorende connectionStringName
ingesteld op de juiste verbindingsreeks (SecurityTutorialsConnectionString
) en de bijbehorende applicationName
waarde expliciet ingesteld.
We zijn nu klaar om het lidmaatschapsframework van onze toepassing te gebruiken. In de volgende zelfstudie bekijken we hoe u nieuwe gebruikersaccounts maakt. Hierna verkennen we verificatie van gebruikers, het uitvoeren van autorisatie op basis van gebruikers en het opslaan van aanvullende gebruikersgerelateerde informatie in de database.
Veel plezier met programmeren!
Meer lezen
Raadpleeg de volgende bronnen voor meer informatie over de onderwerpen die in deze zelfstudie worden besproken:
-
Altijd de eigenschap
applicationName
instellen bij het configureren van lidmaatschap en andere providers in ASP.NET 2.0 - ASP.NET 2.0 Application Services configureren voor het gebruik van SQL Server 2000 of SQL Server 2005
- SQL Server Management Studio downloaden
- ASP.NET 2.0's Lidmaatschap, Rollen en Profiel onderzoeken
-
Het
<add>
-element voor providers van lidmaatschappen -
het element
<membership>
-
Het element
<providers>
voor lidmaatschap -
<clear />
gebruiken bij het toevoegen van providers -
rechtstreeks met de
SqlMembershipProvider
werken
Videotraining over onderwerpen in deze handleiding
Over de auteur
Scott Mitchell, auteur van meerdere ASP/ASP.NET-boeken en oprichter van 4GuysFromRolla.com, werkt sinds 1998 met Microsoft-webtechnologieën. Scott werkt als onafhankelijk consultant, trainer en schrijver. Zijn laatste boek is Sams Teach Yourself ASP.NET 2.0 in 24 uur. Scott kan worden bereikt op mitchell@4guysfromrolla.com of via zijn blog op http://ScottOnWriting.NET.
Speciale dank aan
Deze serie tutorials is beoordeeld door veel nuttige beoordelaars. Hoofdrecensent voor deze zelfstudie was Alicja Maziarz. Bent u geïnteresseerd in het bekijken van mijn aanstaande MSDN-artikelen? Zo ja, laat iets van je horen via mitchell@4GuysFromRolla.com.