Udostępnij za pośrednictwem


Dostawca członkostwa i ról

Przykład członkostwa i dostawcy ról pokazuje, jak usługa może używać ASP.NET członkostwa i dostawców ról do uwierzytelniania i autoryzacji klientów.

W tym przykładzie klient jest aplikacją konsolową (.exe), a usługa jest hostowana przez usługi Internet Information Services (IIS).

Uwaga

Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.

W przykładzie pokazano, jak:

  • Klient może uwierzytelniać się przy użyciu kombinacji nazwy użytkownika i hasła.
  • Serwer może zweryfikować poświadczenia klienta względem dostawcy członkostwa ASP.NET.
  • Serwer można uwierzytelnić przy użyciu certyfikatu X.509 serwera.
  • Serwer może mapować uwierzytelnionego klienta na rolę przy użyciu dostawcy ról ASP.NET.
  • Serwer może użyć polecenia PrincipalPermissionAttribute , aby kontrolować dostęp do niektórych metod udostępnianych przez usługę.

Dostawcy członkostwa i roli są skonfigurowani do używania magazynu wspieranego przez program SQL Server. W pliku konfiguracji usługi określono parametry połączenia i różne opcje. Dostawca członkostwa otrzymuje nazwę SqlMembershipProvider , gdy dostawca roli ma nazwę 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>

Usługa uwidacznia pojedynczy punkt końcowy do komunikowania się z usługą, która jest definiowana przy użyciu pliku konfiguracji Web.config. Punkt końcowy składa się z adresu, powiązania i kontraktu. Powiązanie jest konfigurowane przy użyciu standardu wsHttpBinding, który domyślnie używa uwierzytelniania systemu Windows. W tym przykładzie ustawiono standard wsHttpBinding uwierzytelniania nazwy użytkownika. Zachowanie określa, że certyfikat serwera ma być używany do uwierzytelniania usługi. Certyfikat serwera musi zawierać tę samą wartość dla SubjectName atrybutu findValue w <elemecie konfiguracji serviceCertificate> . Ponadto zachowanie określa, że uwierzytelnianie par nazwa-hasło jest wykonywane przez dostawcę członkostwa ASP.NET, a mapowanie ról jest wykonywane przez dostawcę ról ASP.NET przez określenie nazw zdefiniowanych dla dwóch dostawców.

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

Po uruchomieniu przykładu klient wywołuje różne operacje usługi na trzech różnych kontach użytkowników: Alice, Bob i Charlie. Żądania operacji i odpowiedzi są wyświetlane w oknie konsoli klienta. Wszystkie cztery wywołania wykonane jako użytkownik "Alice" powinny zakończyć się powodzeniem. Podczas próby wywołania metody Divide użytkownik "Bob" powinien otrzymać błąd odmowy dostępu. Podczas próby wywołania metody Multiply użytkownik "Charlie" powinien uzyskać błąd odmowy dostępu. Naciśnij ENTER w oknie klienta, aby zamknąć klienta.

Aby skonfigurować, skompilować i uruchomić przykład

  1. Aby utworzyć wersję języka C# lub Visual Basic platformy .NET rozwiązania, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.

  2. Upewnij się, że skonfigurowano bazę danych usług ASP.NET Application Services.

    Uwaga

    Jeśli używasz programu SQL Server Express Edition, nazwa serwera to .\SQLEXPRESS. Ten serwer powinien być używany podczas konfigurowania bazy danych usług ASP.NET Application Services, a także w parametry połączenia Web.config.

    Uwaga

    Konto procesu roboczego ASP.NET musi mieć uprawnienia do bazy danych utworzonej w tym kroku. Użyj narzędzia sqlcmd lub programu SQL Server Management Studio, aby to zrobić.

  3. Aby uruchomić przykład w konfiguracji pojedynczej lub między komputerami, skorzystaj z poniższych instrukcji.

Aby uruchomić przykład na tym samym komputerze

  1. Upewnij się, że ścieżka zawiera folder, w którym znajduje się Makecert.exe.

  2. Uruchom Setup.bat z przykładowego folderu instalacji w wierszu polecenia dewelopera dla programu Visual Studio uruchom polecenie z uprawnieniami administratora. Spowoduje to zainstalowanie certyfikatów usługi wymaganych do uruchomienia przykładu.

  3. Uruchom Client.exe z \client\bin. Działanie klienta jest wyświetlane w aplikacji konsolowej klienta.

  4. Jeśli klient i usługa nie mogą się komunikować, zobacz Porady dotyczące rozwiązywania problemów z przykładami WCF.

Aby uruchomić przykład na komputerach

  1. Utwórz katalog na komputerze usługi. Utwórz aplikację wirtualną o nazwie servicemodelsamples dla tego katalogu przy użyciu narzędzia do zarządzania usługami Internet Information Services (IIS).

  2. Skopiuj pliki programu usługi z folderu \inetpub\wwwroot\servicemodelsamples do katalogu wirtualnego na komputerze usługi. Upewnij się, że skopiujesz pliki w podkatalogu \bin. Skopiuj również pliki Setup.bat, GetComputerName.vbs i Cleanup.bat na komputer usługi.

  3. Utwórz katalog na komputerze klienckim dla plików binarnych klienta.

  4. Skopiuj pliki programu klienckiego do katalogu klienta na komputerze klienckim. Skopiuj również pliki Setup.bat, Cleanup.bat i ImportServiceCert.bat do klienta.

  5. Na serwerze otwórz wiersz polecenia dla deweloperów dla programu Visual Studio z uprawnieniami administracyjnymi i uruchom polecenie setup.bat service. Uruchomienie setup.bat z argumentem service powoduje utworzenie certyfikatu usługi z w pełni kwalifikowaną nazwą domeny komputera i eksportuje certyfikat usługi do pliku o nazwie Service.cer.

  6. Edytuj plik Web.config, aby odzwierciedlić nową nazwę certyfikatu (w atrybucie findValue serviceCertificate>), która jest taka sama jak w <pełni kwalifikowana nazwa domeny komputera.

  7. Skopiuj plik Service.cer z katalogu usługi do katalogu klienta na komputerze klienckim.

  8. W pliku Client.exe.config na komputerze klienckim zmień wartość adresu punktu końcowego, aby był zgodny z nowym adresem usługi.

  9. Na kliencie otwórz wiersz polecenia dewelopera dla programu Visual Studio z uprawnieniami administracyjnymi i uruchom ImportServiceCert.bat. Spowoduje to zaimportowanie certyfikatu usługi z pliku Service.cer do magazynu CurrentUser — TrustedPeople.

  10. Na komputerze klienckim uruchom Client.exe z wiersza polecenia. Jeśli klient i usługa nie mogą się komunikować, zobacz Porady dotyczące rozwiązywania problemów z przykładami WCF.

Aby wyczyścić po próbce

  • Uruchom Cleanup.bat w folderze samples po zakończeniu uruchamiania przykładu.

Uwaga

Ten skrypt nie usuwa certyfikatów usługi na kliencie podczas uruchamiania tego przykładu na komputerach. Jeśli uruchomiono przykłady programu Windows Communication Foundation (WCF), które korzystają z certyfikatów na komputerach, pamiętaj, aby wyczyścić certyfikaty usługi zainstalowane w magazynie CurrentUser — TrustedPeople. W tym celu użyj następującego polecenia: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> na przykład: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.

Plik wsadowy Instalatora

Plik wsadowy Setup.bat dołączony do tego przykładu umożliwia skonfigurowanie serwera z odpowiednimi certyfikatami w celu uruchomienia aplikacji hostowanej samodzielnie, która wymaga zabezpieczeń opartych na certyfikatach serwera. Ten plik wsadowy należy zmodyfikować tak, aby działał na komputerach lub działać w przypadku innym niż hostowany.

Poniżej przedstawiono krótkie omówienie różnych sekcji plików wsadowych, dzięki czemu można je zmodyfikować w celu uruchomienia w odpowiedniej konfiguracji.

  • Tworzenie certyfikatu serwera.

    Następujące wiersze z pliku wsadowego Setup.bat tworzą certyfikat serwera do użycia. Zmienna %SERVER_NAME% określa nazwę serwera. Zmień tę zmienną, aby określić własną nazwę serwera. Ten plik wsadowy domyślnie jest domyślnie hostem lokalnym.

    Certyfikat jest przechowywany w magazynie My (Personal) w lokalizacji magazynu LocalMachine.

    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
    
  • Instalowanie certyfikatu serwera w zaufanym magazynie certyfikatów klienta.

    Następujące wiersze w pliku wsadowym Setup.bat skopiuj certyfikat serwera do magazynu zaufanych osób klienta. Ten krok jest wymagany, ponieważ certyfikaty generowane przez Makecert.exe nie są niejawnie zaufane przez system kliencki. Jeśli masz już certyfikat, który jest zakorzeniony w zaufanym certyfikacie głównym klienta — na przykład certyfikat wystawiony przez firmę Microsoft — ten krok wypełniania magazynu certyfikatów klienta przy użyciu certyfikatu serwera nie jest wymagany.

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