Zabezpieczenia wiązania niestandardowego

W tym przykładzie pokazano, jak skonfigurować zabezpieczenia przy użyciu powiązania niestandardowego. Pokazuje on, jak używać powiązania niestandardowego w celu włączenia zabezpieczeń na poziomie komunikatów wraz z bezpiecznym transportem. Jest to przydatne, gdy wymagany jest bezpieczny transport do przesyłania komunikatów między klientem i usługą, a jednocześnie komunikaty muszą być bezpieczne na poziomie komunikatu. Ta konfiguracja nie jest obsługiwana przez powiązania dostarczone przez system.

Ten przykład składa się z programu konsolowego klienta (EXE) i programu konsolowego usługi (EXE). Usługa implementuje kontrakt dwukierunkowy. Kontrakt jest definiowany przez ICalculatorDuplex interfejs, który uwidacznia operacje matematyczne (Dodawanie, Odejmowanie, Mnożenie i Dzielenie). Interfejs ICalculatorDuplex umożliwia klientowi wykonywanie operacji matematycznych, obliczanie działającego wyniku w sesji. Niezależnie usługa może zwracać wyniki w interfejsie ICalculatorDuplexCallback . Kontrakt dwukierunkowy wymaga sesji, ponieważ należy ustanowić kontekst, aby skorelować zestaw komunikatów wysyłanych między klientem a usługą. Definiowane jest powiązanie niestandardowe, które obsługuje komunikację dwukierunkową i jest bezpieczne.

Uwaga

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

Konfiguracja usługi definiuje powiązanie niestandardowe, które obsługuje następujące elementy:

  • Komunikacja TCP chroniona przy użyciu protokołu TLS/SSL.

  • Zabezpieczenia komunikatów systemu Windows.

Konfiguracja powiązania niestandardowego umożliwia bezpieczny transport, jednocześnie włączając zabezpieczenia na poziomie komunikatów. Kolejność elementów powiązania jest ważna podczas definiowania powiązania niestandardowego, ponieważ każda z nich reprezentuje warstwę w stosie kanału (zobacz Powiązania niestandardowe). Powiązanie niestandardowe jest definiowane w plikach konfiguracji usługi i klienta, jak pokazano w poniższej przykładowej konfiguracji.

<bindings>
  <!-- Configure a custom binding. -->
  <customBinding>
    <binding name="Binding1">
      <security authenticationMode="SecureConversation"
                 requireSecurityContextCancellation="true">
      </security>
      <textMessageEncoding messageVersion="Soap12WSAddressing10" writeEncoding="utf-8"/>
      <sslStreamSecurity requireClientCertificate="false"/>
      <tcpTransport/>
    </binding>
  </customBinding>
</bindings>

Powiązanie niestandardowe używa certyfikatu usługi do uwierzytelniania usługi na poziomie transportu i ochrony komunikatów podczas transmisji między klientem a usługą. Jest to realizowane przez sslStreamSecurity element powiązania. Certyfikat usługi jest skonfigurowany przy użyciu zachowania usługi, jak pokazano w poniższej przykładowej konfiguracji.

<behaviors>
    <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
        <serviceMetadata />
        <serviceDebug includeExceptionDetailInFaults="False" />
        <serviceCredentials>
        <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
        </serviceCredentials>
    </behavior>
    </serviceBehaviors>
</behaviors>

Ponadto powiązanie niestandardowe używa zabezpieczeń komunikatów z typem poświadczeń systemu Windows — jest to domyślny typ poświadczeń. Jest to realizowane przez security element powiązania. Zarówno klient, jak i usługa są uwierzytelniane przy użyciu zabezpieczeń na poziomie komunikatów, jeśli dostępny jest mechanizm uwierzytelniania Kerberos. Dzieje się tak, jeśli przykład jest uruchamiany w środowisku usługi Active Directory. Jeśli mechanizm uwierzytelniania Kerberos jest niedostępny, używane jest uwierzytelnianie NTLM. Protokół NTLM uwierzytelnia klienta w usłudze, ale nie uwierzytelnia usługi na kliencie. Element security powiązania jest skonfigurowany do używania SecureConversation authenticationTypeelementu , co powoduje utworzenie sesji zabezpieczeń zarówno na kliencie, jak i w usłudze. Jest to wymagane, aby umożliwić pracę kontraktu dwustronnego usługi.

Po uruchomieniu przykładu żądania operacji i odpowiedzi są wyświetlane w oknie konsoli klienta. Naciśnij ENTER w oknie klienta, aby zamknąć klienta.

Press <ENTER> to terminate client.
Result(100)
Result(50)
Result(882.5)
Result(441.25)
Equation(0 + 100 - 50 * 17.65 / 2 = 441.25)

Po uruchomieniu przykładu zobaczysz komunikaty zwrócone do klienta w interfejsie wywołania zwrotnego wysłanego z usługi. Każdy wynik pośredni jest wyświetlany, po którym następuje całe równanie po zakończeniu wszystkich operacji. Naciśnij ENTER, aby zamknąć klienta.

Dołączony plik Setup.bat umożliwia skonfigurowanie klienta i serwera przy użyciu odpowiedniego certyfikatu usługi w celu uruchomienia hostowanej aplikacji wymagającej zabezpieczeń opartych na certyfikatach. 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, które mają zastosowanie do tego przykładu, aby można je było modyfikować w celu uruchomienia w odpowiedniej konfiguracji:

  • Tworzenie certyfikatu serwera.

    Następujące wiersze z pliku 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 określa nazwę serwera na localhost.

    Certyfikat jest przechowywany w magazynie CurrentUser dla usług hostowanych w sieci Web.

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

    Uwaga

    Plik wsadowy Setup.bat jest przeznaczony do uruchamiania z poziomu wiersza polecenia programu Visual Studio 2010. Wymaga to, aby zmienna środowiskowa MSSDK wskazywała katalog, w którym zainstalowano zestaw SDK. Ta zmienna środowiskowa jest automatycznie ustawiana w wierszu polecenia programu Visual Studio 2010.

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

  1. Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.

  2. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

  3. Aby uruchomić przykład w konfiguracji pojedynczej lub między komputerami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.

Aby uruchomić przykład na tym samym komputerze

  1. Otwórz wiersz polecenia dewelopera dla programu Visual Studio z uprawnieniami administratora i uruchom Setup.bat z przykładowego folderu instalacji. Spowoduje to zainstalowanie wszystkich certyfikatów wymaganych do uruchomienia przykładu.

    Uwaga

    Plik wsadowy Setup.bat jest przeznaczony do uruchamiania z poziomu wiersza polecenia programu Visual Studio. Zmienna środowiskowa PATH ustawiona w wierszu polecenia programu Visual Studio wskazuje katalog zawierający pliki wykonywalne wymagane przez skrypt Setup.bat.

  2. Uruchom Service.exe z \service\bin.

  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. Na komputerze usługi:

    1. Utwórz katalog wirtualny o nazwie servicemodelsamples na komputerze usługi.

    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.

    3. Skopiuj pliki Setup.bat i Cleanup.bat na komputer usługi.

    4. Uruchom następujące polecenie w wierszu polecenia dla deweloperów programu Visual Studio otwartym z uprawnieniami administratora: Setup.bat service. Spowoduje to utworzenie certyfikatu usługi o nazwie podmiotu zgodnej z nazwą komputera, w ramach którego został uruchomiony plik wsadowy.

      Uwaga

      Plik wsadowy Setup.bat jest przeznaczony do uruchamiania z poziomu wiersza polecenia programu Visual Studio 2010. Wymaga to, aby zmienna środowiskowa ścieżki wskazywała katalog, w którym zainstalowano zestaw SDK. Ta zmienna środowiskowa jest automatycznie ustawiana w wierszu polecenia programu Visual Studio 2010.

    5. Zmień plik <serviceCertificate> wewnątrz pliku Service.exe.config, aby odzwierciedlić nazwę podmiotu certyfikatu wygenerowanego w poprzednim kroku.

    6. Uruchom Service.exe z wiersza polecenia.

  2. Na komputerze klienckim:

    1. Skopiuj pliki programu klienckiego z folderu \client\bin\ na komputer kliencki. Skopiuj również plik Cleanup.bat.

    2. Uruchom Cleanup.bat, aby usunąć wszystkie stare certyfikaty z poprzednich przykładów.

    3. Wyeksportuj certyfikat usługi, otwierając wiersz polecenia dewelopera dla programu Visual Studio z uprawnieniami administracyjnymi i uruchamiając następujące polecenie na komputerze usługi (zastąp %SERVER_NAME% w pełni kwalifikowaną nazwą komputera, na którym działa usługa):

      certmgr -put -r LocalMachine -s My -c -n %SERVER_NAME% %SERVER_NAME%.cer
      
    4. Skopiuj %SERVER_NAME%.cer na komputer kliencki (zastąp %SERVER_NAME% w pełni kwalifikowaną nazwą komputera, na którym działa usługa).

    5. Zaimportuj certyfikat usługi, otwierając wiersz polecenia dewelopera programu Visual Studio z uprawnieniami administracyjnymi i uruchamiając następujące polecenie na komputerze klienckim (zastąp %SERVER_NAME% w pełni kwalifikowaną nazwą komputera, na którym działa usługa):

      certmgr.exe -add -c %SERVER_NAME%.cer -s -r CurrentUser TrustedPeople
      

      Kroki c, d i e nie są niezbędne, jeśli certyfikat jest wystawiony przez zaufanego wystawcę.

    6. Zmodyfikuj plik App.config klienta w następujący sposób:

      <client>
          <endpoint name="default"
              address="net.tcp://ReplaceThisWithServiceMachineName:8000/ServiceModelSamples/Service"
              binding="customBinding"
              bindingConfiguration="Binding1"
              contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex"
              behaviorConfiguration="CalculatorClientBehavior" />
      </client>
      
    7. Jeśli usługa jest uruchomiona na koncie innym niż konto NetworkService lub LocalSystem w środowisku domeny, może być konieczne zmodyfikowanie tożsamości punktu końcowego dla punktu końcowego usługi w pliku App.config klienta, aby ustawić odpowiednią nazwę UPN lub nazwę SPN na podstawie konta używanego do uruchamiania usługi. Aby uzyskać więcej informacji na temat tożsamości punktu końcowego, zobacz temat Tożsamość usługi i uwierzytelnianie .

    8. Uruchom Client.exe z wiersza polecenia.

Aby wyczyścić po próbce

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