Udostępnij za pośrednictwem


Uwierzytelnianie i tożsamość usług

Tożsamość punktu końcowego usługi to wartość wygenerowana na podstawie języka opisu usług sieci Web (WSDL). Ta wartość, propagowana do dowolnego klienta, jest używana do uwierzytelniania usługi. Gdy klient inicjuje komunikację z punktem końcowym, a usługa uwierzytelnia się w kliencie, klient porównuje wartość tożsamości punktu końcowego z rzeczywistą wartością zwróconą przez proces uwierzytelniania punktu końcowego. Jeśli są one zgodne, klient ma pewność, że skontaktował się z oczekiwanym punktem końcowym usługi. Ta funkcja stanowi ochronę przed wyłudzaniem informacji , uniemożliwiając klientowi przekierowanie do punktu końcowego hostowanego przez złośliwą usługę.

Aby zapoznać się z przykładową aplikacją, która demonstruje ustawienie tożsamości, zobacz Service Identity Sample (Przykład tożsamości usługi). Aby uzyskać więcej informacji na temat punktów końcowych i adresów punktów końcowych, zobacz Adresy.

Uwaga

W przypadku uwierzytelniania przy użyciu NT LanMan (NTLM) tożsamość usługi nie jest sprawdzana, ponieważ w obszarze NTLM klient nie może uwierzytelnić serwera. Protokół NTLM jest używany, gdy komputery są częścią grupy roboczej systemu Windows lub w przypadku uruchamiania starszej wersji systemu Windows, która nie obsługuje uwierzytelniania Kerberos.

Gdy klient inicjuje bezpieczny kanał do wysyłania komunikatu do usługi za jej pośrednictwem, infrastruktura programu Windows Communication Foundation (WCF) uwierzytelnia usługę i wysyła komunikat tylko wtedy, gdy tożsamość usługi jest zgodna z tożsamością określoną w adresie punktu końcowego używanym przez klienta.

Przetwarzanie tożsamości składa się z następujących etapów:

  • W czasie projektowania deweloper klienta określa tożsamość usługi z metadanych punktu końcowego (uwidocznionych za pośrednictwem języka WSDL).

  • W czasie wykonywania aplikacja kliencka sprawdza oświadczenia poświadczeń zabezpieczeń usługi przed wysłaniem komunikatów do usługi.

Przetwarzanie tożsamości na kliencie jest analogiczne do uwierzytelniania klienta w usłudze. Bezpieczna usługa nie wykonuje kodu do momentu uwierzytelnienia poświadczeń klienta. Podobnie klient nie wysyła komunikatów do usługi, dopóki poświadczenia usługi nie zostaną uwierzytelnione na podstawie tego, co jest znane z wyprzedzeniem z metadanych usługi.

Właściwość IdentityEndpointAddress klasy reprezentuje tożsamość usługi wywoływanej przez klienta. Usługa publikuje Identity element w metadanych. Gdy deweloper klienta uruchamia narzędzie ServiceModel Metadata Tool (Svcutil.exe) względem punktu końcowego usługi, wygenerowana konfiguracja zawiera wartość właściwości usługi Identity . Infrastruktura WCF (jeśli została skonfigurowana z zabezpieczeniami) sprawdza, czy usługa ma określoną tożsamość.

Ważne

Metadane zawierają oczekiwaną tożsamość usługi, dlatego zaleca się uwidocznienie metadanych usługi za pomocą bezpiecznych środków, na przykład przez utworzenie punktu końcowego HTTPS dla usługi. Aby uzyskać więcej informacji, zobacz How to: Secure Metadata Endpoints (Instrukcje: zabezpieczanie punktów końcowych metadanych).

Typy tożsamości

Usługa może zapewnić sześć typów tożsamości. Każdy typ tożsamości odpowiada elementowi, który może być zawarty wewnątrz <identity> elementu w konfiguracji. Używany typ zależy od scenariusza i wymagań dotyczących zabezpieczeń usługi. W poniższej tabeli opisano każdy typ tożsamości.

Typ tożsamości opis Typowy scenariusz
System nazw domen (DNS) Użyj tego elementu z certyfikatami X.509 lub kontami systemu Windows. Porównuje ona nazwę DNS określoną w poświadczeniu z wartością określoną w tym elemecie. Sprawdzanie DNS umożliwia używanie certyfikatów z nazwami DNS lub podmiotów. Jeśli certyfikat jest ponownie wystawiany przy użyciu tej samej nazwy DNS lub podmiotu, sprawdzanie tożsamości jest nadal prawidłowe. Gdy certyfikat zostanie ponownie wyświetlony, pobiera nowy klucz RSA, ale zachowuje tę samą nazwę DNS lub podmiotu. Oznacza to, że klienci nie muszą aktualizować informacji o tożsamości usługi.
Certyfikat. Wartość domyślna, gdy ClientCredentialType jest ustawiona na Wartość Certyfikat. Ten element określa wartość certyfikatu X.509 zakodowaną w formacie Base64 w celu porównania z klientem.

Użyj również tego elementu w przypadku używania elementu CardSpace jako poświadczenia do uwierzytelniania usługi.
Ten element ogranicza uwierzytelnianie do pojedynczego certyfikatu na podstawie jego wartości odcisku palca. Umożliwia to bardziej rygorystyczne uwierzytelnianie, ponieważ wartości odcisku palca są unikatowe. Jest to jedno zastrzeżenie: jeśli certyfikat zostanie ponownie wyświetlony z tą samą nazwą podmiotu, ma również nowy odcisk palca. W związku z tym klienci nie mogą zweryfikować usługi, chyba że jest znany nowy odcisk palca. Aby uzyskać więcej informacji na temat znajdowania odcisku palca certyfikatu, zobacz Instrukcje: pobieranie odcisku palca certyfikatu.
Dokumentacja certyfikatu Identyczna z opisaną wcześniej opcją Certyfikat. Jednak ten element umożliwia określenie nazwy certyfikatu i lokalizacji magazynu, z której ma być pobierany certyfikat. Tak samo jak opisany wcześniej scenariusz certyfikatu.

Korzyść polega na tym, że lokalizacja magazynu certyfikatów może ulec zmianie.
RSA Ten element określa wartość klucza RSA do porównania z klientem. Jest to podobne do opcji certyfikatu, ale zamiast używać odcisku palca certyfikatu, zamiast tego jest używany klucz RSA certyfikatu. Sprawdzanie RSA umożliwia ograniczenie uwierzytelniania do pojedynczego certyfikatu na podstawie klucza RSA. Umożliwia to bardziej rygorystyczne uwierzytelnianie określonego klucza RSA kosztem usługi, która nie współpracuje już z istniejącymi klientami, jeśli wartość klucza RSA ulegnie zmianie.
Główna nazwa użytkownika (UPN). Wartość domyślna, gdy ClientCredentialType jest ustawiona na windows, a proces usługi nie jest uruchomiony w ramach jednego z kont systemowych. Ten element określa nazwę UPN, w ramach którego działa usługa. Zobacz sekcję Protokół Kerberos i tożsamość w temacie Zastępowanie tożsamości usługi na potrzeby uwierzytelniania. Dzięki temu usługa jest uruchomiona na określonym koncie użytkownika systemu Windows. Konto użytkownika może być bieżącym zalogowanym użytkownikiem lub usługą działającą na określonym koncie użytkownika.

To ustawienie korzysta z zabezpieczeń protokołu Kerberos systemu Windows, jeśli usługa jest uruchomiona na koncie domeny w środowisku usługi Active Directory.
Nazwa główna usługi (SPN). Wartość domyślna, gdy ClientCredentialType jest ustawiona na windows, a proces usługi jest uruchamiany w ramach jednego z kont systemowych — LocalService, LocalSystem lub NetworkService. Ten element określa nazwę SPN skojarzona z kontem usługi. Zobacz sekcję Protokół Kerberos i tożsamość w temacie Zastępowanie tożsamości usługi na potrzeby uwierzytelniania. Gwarantuje to, że nazwa SPN i określone konto systemu Windows skojarzone z nazwą SPN identyfikują usługę.

Za pomocą narzędzia Setspn.exe można skojarzyć konto komputera dla konta użytkownika usługi.

To ustawienie korzysta z zabezpieczeń protokołu Kerberos systemu Windows, jeśli usługa jest uruchomiona na jednym z kont systemowych lub w ramach konta domeny, które ma skojarzona nazwa SPN z nim, a komputer jest członkiem domeny w środowisku usługi Active Directory.

Określanie tożsamości w usłudze

Zazwyczaj nie trzeba ustawiać tożsamości w usłudze, ponieważ wybór typu poświadczeń klienta określa typ tożsamości uwidocznionej w metadanych usługi. Aby uzyskać więcej informacji na temat zastępowania lub określania tożsamości usługi, zobacz Zastępowanie tożsamości usługi na potrzeby uwierzytelniania.

<Używanie elementu identity> w konfiguracji

Jeśli zmienisz typ poświadczeń klienta w wcześniej pokazanym Certificate, powiązaniu, wygenerowany plik WSDL zawiera zserializowany certyfikat X.509 base64 dla wartości tożsamości, jak pokazano w poniższym kodzie. Jest to ustawienie domyślne dla wszystkich typów poświadczeń klienta innych niż Windows.

Możesz zmienić wartość domyślnej tożsamości usługi lub zmienić typ tożsamości przy użyciu <identity> elementu w konfiguracji lub ustawiając tożsamość w kodzie. Poniższy kod konfiguracji ustawia tożsamość systemu nazw domen (DNS) z wartością contoso.com.

Programowe ustawianie tożsamości

Usługa nie musi jawnie określać tożsamości, ponieważ program WCF automatycznie ją określa. Jednak program WCF umożliwia określenie tożsamości w punkcie końcowym, jeśli jest to wymagane. Poniższy kod dodaje nowy punkt końcowy usługi z określoną tożsamością DNS.

ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
                typeof(ICalculator),
                new WSHttpBinding(),
                String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("http://localhost:8088/calc"),
     EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("http://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd

Określanie tożsamości na kliencie

W czasie projektowania deweloper klienta zwykle używa narzędzia ServiceModel Metadata Tool (Svcutil.exe) do generowania konfiguracji klienta. Wygenerowany plik konfiguracji (przeznaczony do użycia przez klienta) zawiera tożsamość serwera. Na przykład poniższy kod jest generowany na podstawie usługi, która określa tożsamość DNS, jak pokazano w poprzednim przykładzie. Należy pamiętać, że wartość tożsamości punktu końcowego klienta jest zgodna z wartością usługi. W takim przypadku, gdy klient odbiera poświadczenia systemu Windows (Kerberos) dla usługi, oczekuje wartości .contoso.com

Jeśli zamiast systemu Windows usługa określa certyfikat jako typ poświadczeń klienta, właściwość DNS certyfikatu powinna być wartością contoso.com. (Lub jeśli właściwość DNS to null, nazwa podmiotu certyfikatu musi być contoso.com.)

Używanie określonej wartości dla tożsamości

Poniższy plik konfiguracji klienta pokazuje, jak tożsamość usługi ma być określoną wartością. W poniższym przykładzie klient może komunikować się z dwoma punktami końcowymi. Pierwszy jest identyfikowany z odciskiem palca certyfikatu, a drugi z kluczem RSA certyfikatu. Oznacza to, że certyfikat zawierający tylko parę kluczy publicznych/kluczy prywatnych, ale nie jest wystawiany przez zaufany urząd.

Sprawdzanie tożsamości w czasie wykonywania

W czasie projektowania deweloper klienta określa tożsamość serwera za pośrednictwem metadanych. W czasie wykonywania sprawdzanie tożsamości jest wykonywane przed wywołaniem jakichkolwiek punktów końcowych w usłudze.

Wartość tożsamości jest powiązana z typem uwierzytelniania określonego przez metadane; innymi słowy, typ poświadczeń używanych dla usługi.

Jeśli kanał jest skonfigurowany do uwierzytelniania przy użyciu protokołu Secure Sockets Layer (SSL) na poziomie komunikatu lub transportu z certyfikatami X.509 do uwierzytelniania, następujące wartości tożsamości są prawidłowe:

  • DNS. Program WCF zapewnia, że certyfikat dostarczony podczas uzgadniania SSL zawiera atrybut DNS lub CommonName (CN) równy wartości określonej w tożsamości DNS na kliencie. Należy pamiętać, że te kontrole są wykonywane oprócz określania ważności certyfikatu serwera. Domyślnie program WCF sprawdza, czy certyfikat serwera jest wystawiany przez zaufany urząd główny.

  • Certyfikat. Podczas uzgadniania protokołu SSL program WCF zapewnia, że zdalny punkt końcowy zapewnia dokładną wartość certyfikatu określoną w tożsamości.

  • Dokumentacja certyfikatu. Tak samo jak certyfikat.

  • RSA. Podczas uzgadniania protokołu SSL program WCF zapewnia, że zdalny punkt końcowy zapewnia dokładny klucz RSA określony w tożsamości.

Jeśli usługa uwierzytelnia się przy użyciu protokołu SSL na poziomie komunikatu lub transportu przy użyciu poświadczeń systemu Windows do uwierzytelniania i negocjuje poświadczenia, następujące wartości tożsamości są prawidłowe:

  • DNS. Negocjacje przechodzą nazwę SPN usługi, aby można było sprawdzić nazwę DNS. Nazwa SPN ma postać host/<dns name>.

  • SPN. Zwracana jest jawna nazwa SPN usługi, na przykład host/myservice.

  • UPN. Nazwa UPN konta usługi. Nazwa UPN ma postać username@domain. Na przykład gdy usługa jest uruchomiona na koncie użytkownika, może to być username@contoso.com.

Określenie tożsamości programowo (przy użyciu Identity właściwości) jest opcjonalne. Jeśli żadna tożsamość nie zostanie określona, a typ poświadczeń klienta to Windows, wartość domyślna to NAZWA SPN z wartością ustawioną na część nazwy hosta adresu punktu końcowego usługi poprzedzoną literałem "host/". Jeśli nie określono tożsamości, a typ poświadczeń klienta jest certyfikatem, wartość domyślna to Certificate. Dotyczy to zarówno zabezpieczeń na poziomie komunikatów, jak i transportu.

Powiązania tożsamości i niestandardowe

Ponieważ tożsamość usługi zależy od używanego typu powiązania, upewnij się, że podczas tworzenia powiązania niestandardowego uwidoczniona jest odpowiednia tożsamość. Na przykład w poniższym przykładzie kodu uwidoczniona tożsamość nie jest zgodna z typem zabezpieczeń, ponieważ tożsamość powiązania rozruchu bezpiecznej konwersacji nie jest zgodna z tożsamością powiązania w punkcie końcowym. Bezpieczne powiązanie konwersacji ustawia tożsamość DNS, podczas gdy WindowsStreamSecurityBindingElement ustawia nazwę UPN lub nazwę SPN.

CustomBinding binding = new CustomBinding();
// The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.
    CreateSecureConversationBindingElement(
    SecurityBindingElement.
    CreateIssuedTokenForSslBindingElement(
    new IssuedSecurityTokenParameters())));

// The following element requires a UPN or SPN identity.
binding.Elements.Add(new WindowsStreamSecurityBindingElement());
binding.Elements.Add(new TcpTransportBindingElement());
Dim binding As New CustomBinding()
' The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.CreateSecureConversationBindingElement(SecurityBindingElement.CreateIssuedTokenForSslBindingElement(New IssuedSecurityTokenParameters())))

' The following element requires a UPN or SPN identity.
binding.Elements.Add(New WindowsStreamSecurityBindingElement())
binding.Elements.Add(New TcpTransportBindingElement())

Aby uzyskać więcej informacji na temat prawidłowego tworzenia powiązań niestandardowych, zobacz Creating User-Defined Bindings (Tworzenie powiązań zdefiniowanych przez użytkownika). Aby uzyskać więcej informacji na temat tworzenia powiązania niestandardowego za pomocą SecurityBindingElementelementu , zobacz How to: Create a SecurityBindingElement for a Specified Authentication Mode (Jak utworzyć element SecurityBindingElement dla określonego trybu uwierzytelniania).

Zobacz też