Zabezpieczenia komunikatów — przykład
W przykładzie MessageSecurity pokazano, jak zaimplementować aplikację korzystającą z zabezpieczeń komunikatów basicHttpBinding
i . Ten przykład jest oparty na wprowadzenie , który implementuje usługę kalkulatora.
Uwaga
Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.
Tryb basicHttpBinding
zabezpieczeń można ustawić na następujące wartości: Message
, , TransportCredentialOnly
Transport
TransportWithMessageCredential
i .None
W poniższym przykładowym pliku app.config usługi definicja punktu końcowego określa basicHttpBinding
i odwołuje się do konfiguracji powiązania o nazwie Binding1
, jak pokazano w następującej przykładowej konfiguracji:
<system.serviceModel>
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<!-- This endpoint is exposed at the base address provided by -->
<!-- host: http://localhost:8000/ServiceModelSamples/service.-->
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</service>
</services>
...
</system.serviceModel>
Konfiguracja powiązania ustawia mode
atrybut zabezpieczeń<> na Message
i ustawia clientCredentialType
atrybut <komunikatu> naCertificate
, jak pokazano w następującej przykładowej konfiguracji:
<bindings>
<basicHttpBinding>
<!--
This configuration defines the SecurityMode as Message and
the clientCredentialType as Certificate.
-->
<binding name="Binding1" >
<security mode = "Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
Certyfikat używany przez usługę do uwierzytelniania się na kliencie jest ustawiany w sekcji zachowania pliku konfiguracji w ramach serviceCredentials
elementu . Tryb weryfikacji stosowany do certyfikatu używanego przez klienta do uwierzytelniania się w usłudze jest również ustawiany w sekcji zachowania w obszarze elementu clientCertificate
.
<!--For debugging purposes, set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
<!--The serviceCredentials behavior allows one to define a -->
<!--service certificate. A service certificate is used by a -->
<!--client to authenticate the service and provide message -->
<!-- protection. This configuration references the "localhost"-->
<!--certificate installed during the setup instructions. -->
<serviceCredentials>
<serviceCertificate findValue="localhost"
storeLocation="LocalMachine"
storeName="My" x509FindType="FindBySubjectName" />
<clientCertificate>
<!-- Setting the certificateValidationMode to -->
<!-- PeerOrChainTrust means that if the certificate -->
<!--is in the user's Trusted People store, then it is -->
<!-- trusted without performing a validation of the -->
<!-- certificate's issuer chain. This setting is used -->
<!-- here for convenience so that the sample can be run -->
<!-- without having to have certificates issued by a -->
<!-- certification authority (CA). -->
<!-- This setting is less secure than the default, -->
<!-- ChainTrust. The security implications of this -->
<!-- setting should be carefully considered before using -->
<!-- PeerOrChainTrust in production code. -->
<authentication
certificateValidationMode="PeerOrChainTrust" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
Te same szczegóły powiązania i zabezpieczeń są określone w pliku konfiguracji klienta.
Tożsamość obiektu wywołującego jest wyświetlana w oknie konsoli usługi przy użyciu następującego kodu:
Console.WriteLine("Called by {0}", ServiceSecurityContext.Current.PrimaryIdentity.Name);
Po uruchomieniu przykładu żądania operacji i odpowiedzi są wyświetlane w oknie konsoli klienta. Naciśnij klawisz ENTER w oknie klienta, aby zamknąć klienta.
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.
Aby skonfigurować i skompilować przykład
Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.
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).
Aby uruchomić przykład na tej samej maszynie
Uruchom Setup.bat z folderu instalacji przykładowej. Spowoduje to zainstalowanie wszystkich certyfikatów wymaganych do uruchomienia przykładu.
Uwaga
Plik wsadowy Setup.bat jest przeznaczony do uruchamiania z wiersza polecenia zestawu Windows SDK. Wymaga to, aby zmienna środowiskowa MSSDK wskazywała katalog, w którym zainstalowano zestaw SDK. Ta zmienna środowiskowa jest automatycznie ustawiana w wierszu polecenia zestawu Windows SDK.
Uruchom aplikację usługi z \service\bin.
Uruchom aplikację klienckę z folderu \client\bin. Działanie klienta jest wyświetlane w aplikacji konsolowej klienta.
Jeśli klient i usługa nie mogą się komunikować, zobacz Rozwiązywanie problemów Wskazówki dla przykładów programu WCF.
Usuń certyfikaty, uruchamiając Cleanup.bat po zakończeniu pracy z przykładem. Inne przykłady zabezpieczeń używają tych samych certyfikatów.
Aby uruchomić przykład między maszynami
Utwórz katalog na maszynie usługi dla plików binarnych usługi.
Skopiuj pliki programu usługi do katalogu usługi na serwerze. Skopiuj również pliki Setup.bat, Cleanup.bat i ImportClientCert.bat na serwer.
Utwórz katalog na maszynie klienckiej dla plików binarnych klienta.
Skopiuj pliki programu klienckiego do katalogu klienta na komputerze klienckim. Skopiuj również pliki Setup.bat, Cleanup.bat i ImportServiceCert.bat do klienta.
Na serwerze uruchom polecenie
setup.bat service
. Uruchomieniesetup.bat
z argumentemservice
powoduje utworzenie certyfikatu usługi z w pełni kwalifikowaną nazwą domeny maszyny i eksportuje certyfikat usługi do pliku o nazwie Service.cer.Edytuj plik Service.exe.config, aby odzwierciedlić nową nazwę certyfikatu (w atrybucie
findValue
w elemencie serviceCertificate>), który jest taki sam jak w <pełni kwalifikowana nazwa domeny maszyny. Zmień również wartość adresu podstawowego, aby określić w pełni kwalifikowaną nazwę maszyny zamiast hosta lokalnego.
Skopiuj plik Service.cer z katalogu usługi do katalogu klienta na komputerze klienckim.
Na kliencie uruchom polecenie
setup.bat client
. Uruchomieniesetup.bat
z argumentemclient
powoduje utworzenie certyfikatu klienta o nazwie client.com i wyeksportowanie certyfikatu klienta do pliku o nazwie Client.cer.W pliku Client.exe.config na komputerze klienckim zmień wartość adresu punktu końcowego, aby odpowiadała nowemu adresowi usługi. W tym celu należy zastąpić hosta lokalnego w pełni kwalifikowaną nazwą domeny serwera.
findValue
Zmień również atrybut defaultCertificate>< na nową nazwę certyfikatu usługi, która jest w pełni kwalifikowaną nazwą domeny serwera.Skopiuj plik Client.cer z katalogu klienta do katalogu usługi na serwerze.
Na kliencie uruchom ImportServiceCert.bat. Spowoduje to zaimportowanie certyfikatu usługi z pliku Service.cer do magazynu CurrentUser — Trusted Osoby.
Na serwerze uruchom ImportClientCert.bat. Spowoduje to zaimportowanie certyfikatu klienta z pliku Client.cer do magazynu LocalMachine — Trusted Osoby.
Na maszynie usługi uruchom Service.exe z wiersza polecenia.
Na komputerze klienckim uruchom Client.exe z okna wiersza polecenia.
- Jeśli klient i usługa nie mogą się komunikować, zobacz Rozwiązywanie problemów Wskazówki dla przykładów programu 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 maszynach. Jeśli uruchomiono przykłady programu Windows Communication Foundation (WCF), które korzystają z certyfikatów na maszynach, wyczyść certyfikaty usługi zainstalowane w magazynie CurrentUser — Trusted Osoby. W tym celu użyj następującego polecenia: Na przykład:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com