Medlemskap och rollprovider
Exemplet medlemskap och rollprovider visar hur en tjänst kan använda ASP.NET medlemskap och rollproviders för att autentisera och auktorisera klienter.
I det här exemplet är klienten ett konsolprogram (.exe) och tjänsten hanteras av Internet Information Services (IIS).
Kommentar
Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.
Exemplet visar hur:
- En klient kan autentisera med hjälp av kombinationen användarnamn och lösenord.
- Servern kan verifiera klientautentiseringsuppgifterna mot ASP.NET-medlemskapsprovidern.
- Servern kan autentiseras med hjälp av serverns X.509-certifikat.
- Servern kan mappa den autentiserade klienten till en roll med hjälp av ASP.NET rollprovider.
- Servern kan använda
PrincipalPermissionAttribute
för att styra åtkomsten till vissa metoder som exponeras av tjänsten.
Medlemskaps- och rollprovidrar är konfigurerade för att använda ett arkiv som backas upp av SQL Server. En niska veze och olika alternativ anges i tjänstkonfigurationsfilen. Medlemskapsprovidern får namnet SqlMembershipProvider
medan rollprovidern får namnet SqlRoleProvider
.
<!-- Set the connection string for SQL Server -->
<connectionStrings>
<add name="SqlConn"
connectionString="..." />
</connectionStrings>
<system.web>
<!-- Configure the Sql Membership Provider -->
<membership defaultProvider="SqlMembershipProvider" userIsOnlineTimeWindow="15">
<providers>
<clear />
<add
name="SqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SqlConn"
applicationName="MembershipAndRoleProviderSample"
enablePasswordRetrieval="false"
enablePasswordReset="false"
requiresQuestionAndAnswer="false"
requiresUniqueEmail="true"
passwordFormat="Hashed" />
</providers>
</membership>
<!-- Configure the Sql Role Provider -->
<roleManager enabled ="true"
defaultProvider ="SqlRoleProvider" >
<providers>
<add name ="SqlRoleProvider"
type="System.Web.Security.SqlRoleProvider"
connectionStringName="SqlConn"
applicationName="MembershipAndRoleProviderSample"/>
</providers>
</roleManager>
</system.web>
Tjänsten exponerar en enskild slutpunkt för kommunikation med tjänsten, som definieras med hjälp av konfigurationsfilen Web.config. Slutpunkten består av en adress, en bindning och ett kontrakt. Bindningen konfigureras med en standard wsHttpBinding
, som standard är att använda Windows-autentisering. Det här exemplet anger standarden wsHttpBinding
för att använda användarnamnsautentisering. Beteendet anger att servercertifikatet ska användas för tjänstautentisering. Servercertifikatet måste innehålla samma värde som SubjectName
attributet i konfigurationselementet <serviceCertificate>.findValue
Dessutom anger beteendet att autentisering av par med användarnamn och lösenord utförs av ASP.NET medlemskapsprovidern och rollmappning utförs av ASP.NET rollprovider genom att ange namnen som definierats för de två leverantörerna.
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
<wsHttpBinding>
<!-- Set up a binding that uses Username as the client credential type -->
<binding>
<security mode ="Message">
<message clientCredentialType ="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- Configure role based authorization to use the Role Provider -->
<serviceAuthorization principalPermissionMode ="UseAspNetRoles"
roleProviderName ="SqlRoleProvider" />
<serviceCredentials>
<!-- Configure user name authentication to use the Membership Provider -->
<userNameAuthentication userNamePasswordValidationMode ="MembershipProvider"
membershipProviderName ="SqlMembershipProvider"/>
<!-- Configure the service certificate -->
<serviceCertificate storeLocation ="LocalMachine"
storeName ="My"
x509FindType ="FindBySubjectName"
findValue ="localhost" />
</serviceCredentials>
<!--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
När du kör exemplet anropar klienten de olika tjänståtgärderna under tre olika användarkonton: Alice, Bob och Charlie. Åtgärdsbegäranden och svar visas i klientkonsolfönstret. Alla fyra anrop som görs som användaren "Alice" ska lyckas. Användaren "Bob" bör få ett felmeddelande om nekad åtkomst när han eller hon försöker anropa metoden Dividera. Användaren "Charlie" bör få ett felmeddelande om nekad åtkomst när han eller hon försöker anropa metoden Multiplicera. Tryck på RETUR i klientfönstret för att stänga av klienten.
Så här konfigurerar du, skapar och kör exemplet
Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Köra Windows Communication Foundation-exempel.
Kontrollera att du har konfigurerat ASP.NET Application Services-databasen.
Kommentar
Om du kör SQL Server Express Edition är servernamnet .\SQLEXPRESS. Den här servern bör användas när du konfigurerar ASP.NET Application Services-databasen samt i web.config-niska veze.
Kommentar
Det ASP.NET arbetsprocesskontot måste ha behörighet för databasen som skapas i det här steget. Använd sqlcmd-verktyget eller SQL Server Management Studio för att göra detta.
Om du vill köra exemplet i en konfiguration med en eller flera datorer använder du följande instruktioner.
Så här kör du exemplet på samma dator
Kontrollera att sökvägen innehåller mappen där Makecert.exe finns.
Kör Setup.bat från exempelinstallationsmappen i en kommandotolk för utvecklare för Visual Studio som körs med administratörsbehörighet. Detta installerar de tjänstcertifikat som krävs för att köra exemplet.
Starta Client.exe från \client\bin. Klientaktiviteten visas i klientkonsolprogrammet.
Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.
Så här kör du exemplet mellan datorer
Skapa en katalog på tjänstdatorn. Skapa ett virtuellt program med namnet servicemodelsamples för den här katalogen med hjälp av IIS-hanteringsverktyget (Internet Information Services).
Kopiera tjänstprogramfilerna från \inetpub\wwwroot\servicemodelsamples till den virtuella katalogen på tjänstdatorn. Se till att du kopierar filerna i underkatalogen \bin. Kopiera även Setup.bat, GetComputerName.vbs och Cleanup.bat filer till tjänstdatorn.
Skapa en katalog på klientdatorn för klient binärfilerna.
Kopiera klientprogramfilerna till klientkatalogen på klientdatorn. Kopiera även filerna Setup.bat, Cleanup.bat och ImportServiceCert.bat till klienten.
På servern öppnar du en kommandotolk för utvecklare för Visual Studio med administratörsbehörighet och kör
setup.bat service
. När duservice
körsetup.bat
med argumentet skapas ett tjänstcertifikat med datorns fullständigt kvalificerade domännamn och tjänstcertifikatet exporteras till en fil med namnet Service.cer.Redigera Web.config för att återspegla det nya certifikatnamnet (i
findValue
attributet i <serviceCertificate>), som är samma som datorns fullständigt kvalificerade domännamn.Kopiera Service.cer-filen från tjänstkatalogen till klientkatalogen på klientdatorn.
I filen Client.exe.config på klientdatorn ändrar du slutpunktens adressvärde så att det matchar tjänstens nya adress.
På klienten öppnar du en kommandotolk för utvecklare för Visual Studio med administratörsbehörighet och kör ImportServiceCert.bat. Detta importerar tjänstcertifikatet från Service.cer-filen till arkivet CurrentUser – TrustedPeople.
Starta Client.exe från en kommandotolk på klientdatorn. Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.
Rensa efter exemplet
- Kör Cleanup.bat i exempelmappen när du har kört exemplet.
Kommentar
Det här skriptet tar inte bort tjänstcertifikat på en klient när du kör det här exemplet på flera datorer. Om du har kört WCF-exempel (Windows Communication Foundation) som använder certifikat mellan datorer måste du rensa de tjänstcertifikat som har installerats i arkivet CurrentUser – TrustedPeople. Det gör du genom att använda följande kommando: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
Till exempel: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com
.
Konfigurera Batch-filen
Med Setup.bat batchfil som ingår i det här exemplet kan du konfigurera servern med relevanta certifikat för att köra ett program med egen värd som kräver servercertifikatbaserad säkerhet. Den här batchfilen måste ändras för att fungera mellan datorer eller för att fungera i ett fall som inte är värdbaserat.
Följande ger en kort översikt över de olika avsnitten i batchfilerna så att de kan ändras så att de körs i lämplig konfiguration.
Skapa servercertifikatet.
Följande rader från Setup.bat batchfil skapar det servercertifikat som ska användas. Variabeln %SERVER_NAME% anger servernamnet. Ändra den här variabeln för att ange ditt eget servernamn. Den här batchfilen är som standard localhost.
Certifikatet lagras i mitt (personligt) arkiv under platsen för LocalMachine-arkivet.
echo ************ echo Server cert setup starting echo %SERVER_NAME% echo ************ echo making server cert echo ************ makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
Installera servercertifikatet i klientens betrodda certifikatarkiv.
Följande rader i Setup.bat batchfil kopierar servercertifikatet till klientarkivet för betrodda personer. Det här steget krävs eftersom certifikat som genereras av Makecert.exe inte är implicit betrodda av klientsystemet. Om du redan har ett certifikat som är rotat i ett klientbetrott rotcertifikat, till exempel ett Microsoft-utfärdat certifikat, krävs inte det här steget för att fylla i klientcertifikatarkivet med servercertifikatet.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople