Udostępnij za pośrednictwem


Zabezpieczenia wiązania niestandardowego

W tym przykładzie pokazano, jak skonfigurować zabezpieczenia przy użyciu powiązania niestandardowego. Pokazuje, jak użyć powiązania niestandardowego do aktywacji zabezpieczeń na poziomie komunikatów jednocześnie z zabezpieczonym 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 bieżą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 niestandardowe powiązanie używa zabezpieczenia wiadomości z typem poświadczeń Windows, co stanowi 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 klientowi. Element security powiązania jest skonfigurowany do używania SecureConversationauthenticationType, co powoduje utworzenie sesji zabezpieczeń zarówno na kliencie, jak i dla usługi. Jest to wymagane, aby umożliwić działanie 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 za pośrednictwem interfejsu wywołania zwrotnego, które zostały wysłane 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ć, aby działał na różnych komputerach lub w środowisku innym niż hostowane.

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

    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 do zaufanego magazynu certyfikatów klienta.

    Następujące wiersze w pliku Setup.bat kopiują certyfikat serwera do magazynu zaufanych osób na komputerze klienta. Ten krok jest wymagany, ponieważ certyfikaty generowane przez Makecert.exe nie są automatycznie zaufane przez system klienta. 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ładowy program

  1. Upewnij się, że wykonano procedurę jednorazowej konfiguracji przykładów 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. To zainstaluje wszystkie certyfikaty wymagane do uruchomienia próbki.

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

  1. Na komputerze serwisowym

    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 posprzątać po pracy z próbką

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