Zabezpieczenia komunikatów z anonimowością
Przykład Anonimowy zabezpieczenia komunikatów pokazuje, jak zaimplementować aplikację windows Communication Foundation (WCF), która korzysta z zabezpieczeń na poziomie komunikatów bez uwierzytelniania klienta, ale wymaga uwierzytelniania serwera przy użyciu certyfikatu X.509 serwera. Wszystkie komunikaty aplikacji między klientem a serwerem są podpisane i szyfrowane. Ten przykład jest oparty na przykładzie WSHttpBinding . Ten przykład składa się z programu konsolowego klienta (.exe) i biblioteki usług (.dll) hostowanej przez usługi Internet Information Services (IIS). Usługa implementuje kontrakt, który definiuje wzorzec komunikacji typu żądanie-odpowiedź.
Uwaga
Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.
Ten przykład dodaje nową operację do interfejsu kalkulatora, która zwraca True
, jeśli klient nie został uwierzytelniony.
public class CalculatorService : ICalculator
{
public bool IsCallerAnonymous()
{
// ServiceSecurityContext.IsAnonymous returns true if the caller is not authenticated.
return ServiceSecurityContext.Current.IsAnonymous;
}
...
}
Usługa uwidacznia pojedynczy punkt końcowy do komunikowania się z usługą, zdefiniowany przy użyciu pliku konfiguracji (Web.config). Punkt końcowy składa się z adresu, powiązania i kontraktu. Powiązanie jest konfigurowane za pomocą wsHttpBinding
powiązania. Domyślnym trybem wsHttpBinding
zabezpieczeń dla powiązania jest Message
. Atrybut clientCredentialType
jest ustawiony na None
wartość .
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
<wsHttpBinding>
<!-- This configuration defines the security mode as Message and -->
<!-- the clientCredentialType as None. This mode provides -->
<!-- server authentication only using the service certificate. -->
<binding>
<security mode="Message">
<message clientCredentialType="None" />
</security>
</binding>
</wsHttpBinding>
</bindings>
...
</system.serviceModel>
Poświadczenia, które mają być używane do uwierzytelniania usługi, są określone w zachowaniu><. Certyfikat serwera musi zawierać tę samą wartość dla wartości określonej dla SubjectName
atrybutu findValue
, jak pokazano w poniższym przykładowym kodzie.
<behaviors>
<serviceBehaviors>
<behavior>
<!--
The serviceCredentials behavior allows you 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" />
</serviceCredentials>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
Konfiguracja punktu końcowego klienta składa się z bezwzględnego adresu punktu końcowego usługi, powiązania i kontraktu. Tryb zabezpieczeń klienta dla wsHttpBinding
powiązania to Message
. Atrybut clientCredentialType
jest ustawiony na None
wartość .
<system.serviceModel>
<client>
<endpoint name=""
address="http://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
behaviorConfiguration="ClientCredentialsBehavior"
bindingConfiguration="Binding1"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</client>
<bindings>
<wsHttpBinding>
<!--This configuration defines the security mode as -->
<!--Message and the clientCredentialType as None. -->
<binding name="Binding1">
<security mode = "Message">
<message clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
...
</system.serviceModel>
Przykład ustawia wartość na CertificateValidationMode wartość na PeerOrChainTrust potrzeby uwierzytelniania certyfikatu usługi. Odbywa się to w pliku App.config klienta w behaviors
sekcji . Oznacza to, że jeśli certyfikat znajduje się w magazynie zaufanych Osoby użytkownika, jest zaufany bez przeprowadzania weryfikacji łańcucha wystawców certyfikatu. To ustawienie jest używane w tym miejscu dla wygody, aby można było uruchomić przykład bez wymagania certyfikatów wystawionych przez urząd certyfikacji (CA). To ustawienie jest mniej bezpieczne niż wartość domyślna ChainTrust. Implikacje bezpieczeństwa tego ustawienia należy dokładnie rozważyć przed użyciem PeerOrChainTrust
w kodzie produkcyjnym.
Implementacja klienta dodaje wywołanie metody IsCallerAnonymous
i w przeciwnym razie nie różni się od przykładu WSHttpBinding .
// Create a client with a client endpoint configuration.
CalculatorClient client = new CalculatorClient();
// Call the GetCallerIdentity operation.
Console.WriteLine("IsCallerAnonymous returned: {0}", client.IsCallerAnonymous());
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
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.
IsCallerAnonymous returned: True
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.
Plik wsadowy Setup.bat dołączony do przykładu Anonimowe zabezpieczenia wiadomości umożliwia skonfigurowanie serwera z odpowiednim certyfikatem w celu uruchomienia hostowanej aplikacji wymagającej zabezpieczeń opartych na certyfikatach. Plik wsadowy można uruchomić w dwóch trybach. Aby uruchomić plik wsadowy w trybie pojedynczego komputera, wpisz setup.bat
w wierszu polecenia. Aby uruchomić go w trybie usługi, wpisz setup.bat service
. Użyj tego trybu podczas uruchamiania przykładu na komputerach. Aby uzyskać szczegółowe informacje, zobacz procedurę konfiguracji na końcu tego tematu.
Poniżej przedstawiono krótkie omówienie różnych sekcji plików wsadowych:
Tworzenie certyfikatu serwera.
Następujące wiersze z pliku wsadowego Setup.bat tworzą certyfikat serwera do użycia.
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
Zmienna %SERVER_NAME% określa nazwę serwera. Certyfikat jest przechowywany w magazynie LocalMachine. Jeśli plik wsadowy instalatora jest uruchamiany z argumentem usługi (na przykład
setup.bat service
) %SERVER_NAME% zawiera w pełni kwalifikowaną nazwę domeny komputera. W przeciwnym razie wartość domyślna to localhost.Instalowanie certyfikatu serwera w zaufanym magazynie certyfikatów klienta.
Poniższy wiersz kopiuje 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
Udzielanie uprawnień do klucza prywatnego certyfikatu.
Następujące wiersze w pliku wsadowym Setup.bat sprawiają, że certyfikat serwera przechowywany w magazynie LocalMachine jest dostępny dla konta procesu roboczego ASP.NET.
echo ************ echo setting privileges on server certificates echo ************ for /F "delims=" %%i in ('"%MSSDK%\bin\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE (ver | findstr "5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R iisreset
Uwaga
Jeśli używasz spoza USA Wersja angielska systemu Windows musi edytować plik Setup.bat i zastąpić NT AUTHORITY\NETWORK SERVICE
nazwę konta regionalnym odpowiednikiem.
Aby skonfigurować, skompilować i uruchomić 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 tym samym komputerze
Upewnij się, że ścieżka zawiera folder, w którym znajdują się Makecert.exe i FindPrivateKey.exe.
Uruchom Setup.bat z przykładowego folderu instalacji w wierszu polecenia dewelopera dla programu Visual Studio uruchom polecenie z uprawnieniami administratora. Spowoduje to zainstalowanie wszystkich certyfikatów wymaganych do uruchomienia przykładu.
Uwaga
Plik wsadowy instalatora jest przeznaczony do uruchamiania z poziomu wiersza polecenia dla deweloperów dla programu Visual Studio. 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 dla deweloperów dla programu Visual Studio.
Sprawdź dostęp do usługi przy użyciu przeglądarki, wprowadzając adres
http://localhost/servicemodelsamples/service.svc
.Uruchom Client.exe z \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.
Aby uruchomić przykład na komputerach
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).
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 i Cleanup.bat na komputer usługi.
Utwórz katalog na komputerze klienckim 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
w wierszu polecenia dla deweloperów dla programu Visual Studio otwarte z uprawnieniami administratora. Uruchomieniesetup.bat
z argumentemservice
powoduje utworzenie certyfikatu usługi z w pełni kwalifikowaną nazwą domeny komputera i eksportuje certyfikat usługi do pliku o nazwie Service.cer.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.Skopiuj plik Service.cer z katalogu usługi do katalogu klienta na komputerze klienckim.
W pliku Client.exe.config na komputerze klienckim zmień wartość adresu punktu końcowego, aby był zgodny z nowym adresem usługi.
Na kliencie uruchom ImportServiceCert.bat w wierszu polecenia dewelopera dla programu Visual Studio otwartym z uprawnieniami administratora. Spowoduje to zaimportowanie certyfikatu usługi z pliku Service.cer do magazynu CurrentUser — Trusted Osoby.
Na komputerze klienckim uruchom Client.exe z 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 komputerach. Jeśli uruchomiono przykłady programu Windows Communication Foundation (WCF) korzystające z certyfikatów na komputerach, pamiętaj, aby wyczyścić 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.