Delen via


Lidmaatschaps- en rolprovider

Het voorbeeld lidmaatschap en rolprovider laat zien hoe een service de ASP.NET lidmaatschaps- en rolproviders kan gebruiken om clients te verifiëren en te autoriseren.

In dit voorbeeld is de client een consoletoepassing (.exe) en wordt de service gehost door Internet Information Services (IIS).

Notitie

De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.

In het voorbeeld ziet u hoe:

  • Een client kan worden geverifieerd met behulp van de combinatie van gebruikersnaam en wachtwoord.
  • De server kan de clientreferenties valideren voor de ASP.NET lidmaatschapsprovider.
  • De server kan worden geverifieerd met behulp van het X.509-certificaat van de server.
  • De server kan de geverifieerde client toewijzen aan een rol met behulp van de ASP.NET rolprovider.
  • De server kan de PrincipalPermissionAttribute toegang tot bepaalde methoden beheren die door de service worden weergegeven.

De lidmaatschaps- en rolproviders zijn geconfigureerd voor het gebruik van een archief dat wordt ondersteund door SQL Server. Een verbindingsreeks en verschillende opties worden opgegeven in het serviceconfiguratiebestand. De lidmaatschapsprovider krijgt de naam SqlMembershipProvider terwijl de rolprovider de naam SqlRoleProviderkrijgt.

<!-- 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>

De service maakt één eindpunt beschikbaar voor communicatie met de service, die wordt gedefinieerd met behulp van het configuratiebestand Web.config. Het eindpunt bestaat uit een adres, een binding en een contract. De binding wordt geconfigureerd met een standaard wsHttpBinding, die standaard gebruikmaakt van Windows-verificatie. In dit voorbeeld wordt de standaard wsHttpBinding ingesteld voor het gebruik van verificatie via gebruikersnaam. Het gedrag geeft aan dat het servercertificaat moet worden gebruikt voor serviceverificatie. Het servercertificaat moet dezelfde waarde bevatten voor het SubjectName kenmerk in het< configuratie-element serviceCertificate>.findValue Daarnaast geeft het gedrag aan dat verificatie van gebruikersnaam-wachtwoordparen wordt uitgevoerd door de ASP.NET lidmaatschapsprovider en roltoewijzing wordt uitgevoerd door de ASP.NET rolprovider door de namen op te geven die zijn gedefinieerd voor de twee providers.

<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>

Wanneer u het voorbeeld uitvoert, roept de client de verschillende servicebewerkingen aan onder drie verschillende gebruikersaccounts: Alice, Bob en Charlie. De bewerkingsaanvragen en -antwoorden worden weergegeven in het venster van de clientconsole. Alle vier de aanroepen die worden gedaan als gebruiker Alice, moeten slagen. Gebruiker 'Bob' krijgt de fout 'Toegang geweigerd' bij het aanroepen van de methode Divide. Gebruiker 'Charlie' krijgt de fout 'Toegang geweigerd' bij het aanroepen van de methode Multiply. Druk op Enter in het clientvenster om de client af te sluiten.

Het voorbeeld instellen, compileren en uitvoeren

  1. Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.

  2. Zorg ervoor dat u de ASP.NET Application Services-database hebt geconfigureerd.

    Notitie

    Als u SQL Server Express Edition uitvoert, is uw servernaam .\SQLEXPRESS. Deze server moet worden gebruikt bij het configureren van de ASP.NET Application Services-database en in de web.config-verbindingsreeks.

    Notitie

    Het ASP.NET werkprocesaccount moet machtigingen hebben voor de database die in deze stap is gemaakt. Gebruik hiervoor het hulpprogramma sqlcmd of SQL Server Management Studio.

  3. Als u het voorbeeld wilt uitvoeren in een configuratie van één of meerdere computers, gebruikt u de volgende instructies.

Het voorbeeld uitvoeren op dezelfde computer

  1. Zorg ervoor dat het pad de map bevat waarin Makecert.exe zich bevindt.

  2. Voer Setup.bat uit vanuit de voorbeeldinstallatiemap in een opdrachtprompt voor Ontwikkelaars voor Visual Studio met beheerdersbevoegdheden. Hiermee worden de servicecertificaten geïnstalleerd die vereist zijn voor het uitvoeren van het voorbeeld.

  3. Start Client.exe vanuit \client\bin. Clientactiviteit wordt weergegeven in de clientconsoletoepassing.

  4. Als de client en service niet kunnen communiceren, raadpleegt u Tips voor probleemoplossing voor WCF-voorbeelden.

Het voorbeeld uitvoeren op computers

  1. Maak een map op de servicecomputer. Maak een virtuele toepassing met de naam servicemodelsamples voor deze map met behulp van het iis-beheerprogramma (Internet Information Services).

  2. Kopieer de serviceprogrammabestanden van \inetpub\wwwroot\servicemodelsamples naar de virtuele map op de servicecomputer. Zorg ervoor dat u de bestanden in de submap \bin kopieert. Kopieer ook de bestanden Setup.bat, GetComputerName.vbs en Cleanup.bat naar de servicecomputer.

  3. Maak een map op de clientcomputer voor de binaire clientbestanden.

  4. Kopieer de clientprogrammabestanden naar de clientmap op de clientcomputer. Kopieer ook de bestanden Setup.bat, Cleanup.bat en ImportServiceCert.bat naar de client.

  5. Open op de server een opdrachtprompt voor Ontwikkelaars voor Visual Studio met beheerdersbevoegdheden en voer deze uit setup.bat service. Als u het service argument uitvoertsetup.bat, maakt u een servicecertificaat met de volledig gekwalificeerde domeinnaam van de computer en exporteert u het servicecertificaat naar een bestand met de naam Service.cer.

  6. Bewerk Web.config om de nieuwe certificaatnaam (in het findValue kenmerk in serviceCertificate <) weer te> geven. Dit is hetzelfde als de volledig gekwalificeerde domeinnaam van de computer.

  7. Kopieer het Service.cer-bestand van de servicemap naar de clientmap op de clientcomputer.

  8. Wijzig in het bestand Client.exe.config op de clientcomputer de adreswaarde van het eindpunt zodat deze overeenkomt met het nieuwe adres van uw service.

  9. Open op de client een opdrachtprompt voor Ontwikkelaars voor Visual Studio met beheerdersbevoegdheden en voer ImportServiceCert.bat uit. Hiermee importeert u het servicecertificaat uit het Service.cer-bestand in het archief CurrentUser - TrustedPeople.

  10. Start Client.exe vanaf een opdrachtprompt op de clientcomputer. Als de client en service niet kunnen communiceren, raadpleegt u Tips voor probleemoplossing voor WCF-voorbeelden.

Opschonen na het voorbeeld

  • Voer Cleanup.bat uit in de map met voorbeelden nadat u het voorbeeld hebt uitgevoerd.

Notitie

Dit script verwijdert geen servicecertificaten op een client bij het uitvoeren van dit voorbeeld op computers. Als u WCF-voorbeelden (Windows Communication Foundation) hebt uitgevoerd die gebruikmaken van certificaten op computers, moet u de servicecertificaten wissen die zijn geïnstalleerd in het archief CurrentUser - TrustedPeople. Gebruik hiervoor de volgende opdracht: bijvoorbeeld: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.

Het Batch-installatiebestand

Met het Setup.bat batchbestand dat is opgenomen in dit voorbeeld, kunt u de server configureren met relevante certificaten om een zelf-hostende toepassing uit te voeren waarvoor beveiliging op basis van servercertificaten is vereist. Dit batchbestand moet worden gewijzigd om te kunnen werken op computers of om te kunnen werken in een niet-gehost geval.

Hieronder vindt u een kort overzicht van de verschillende secties van de batchbestanden, zodat ze kunnen worden gewijzigd om te worden uitgevoerd in de juiste configuratie.

  • Het servercertificaat maken.

    De volgende regels uit het Setup.bat batchbestand maken het servercertificaat dat moet worden gebruikt. De variabele %SERVER_NAME% geeft de servernaam op. Wijzig deze variabele om uw eigen servernaam op te geven. Dit batchbestand wordt standaard ingesteld op localhost.

    Het certificaat wordt opgeslagen in Mijn (Persoonlijk) archief onder de locatie van het LocalMachine-archief.

    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
    
  • Het servercertificaat installeren in het vertrouwde certificaatarchief van de client.

    Met de volgende regels in het Setup.bat batchbestand kopieert u het servercertificaat naar het archief vertrouwde personen van de client. Deze stap is vereist omdat certificaten die worden gegenereerd door Makecert.exe niet impliciet worden vertrouwd door het clientsysteem. Als u al een certificaat hebt dat is geroot in een vertrouwd basiscertificaat van een client, bijvoorbeeld een door Microsoft uitgegeven certificaat, is deze stap voor het invullen van het clientcertificaatarchief met het servercertificaat niet vereist.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople