Udostępnij za pośrednictwem


Przesłanianie tożsamości usługi na potrzeby uwierzytelniania

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. Na przykład poniższy kod konfiguracji używa <elementu wsHttpBinding> i ustawia clientCredentialType atrybut na windows.

Poniższy fragment języka WSDL (Web Services Description Language) przedstawia tożsamość punktu końcowego zdefiniowanego wcześniej. W tym przykładzie usługa jest uruchomiona jako usługa hostowana samodzielnie w ramach określonego konta użytkownika (username@contoso.com), dlatego tożsamość głównej nazwy użytkownika (UPN) zawiera nazwę konta. Nazwa UPN jest również znana jako nazwa logowania użytkownika w domenie systemu Windows.

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 tożsamości usługi, zobacz Service Identity and Authentication (Tożsamość usługi i uwierzytelnianie).

Uwierzytelnianie i tożsamość protokołu Kerberos

Domyślnie, gdy usługa jest skonfigurowana do używania poświadczeń systemu Windows, <element tożsamości> zawierający <element userPrincipalName> lub <servicePrincipalName> jest generowany w języku WSDL. Jeśli usługa jest uruchomiona w ramach LocalSystemkonta , LocalServicelubNetworkService, główna nazwa usługi (SPN) jest domyślnie generowana w postaci host/<nazwy> hosta, ponieważ te konta mają dostęp do danych spN komputera. Jeśli usługa jest uruchomiona na innym koncie, program Windows Communication Foundation (WCF) generuje nazwę UPN w postaci <nazwa_użytkownika>@<nazwa_>domeny. Dzieje się tak, ponieważ uwierzytelnianie Kerberos wymaga podania do klienta nazwy UPN lub nazwy SPN w celu uwierzytelnienia usługi.

Możesz również użyć narzędzia Setspn , aby zarejestrować dodatkową nazwę SPN przy użyciu konta usługi w domenie. Następnie możesz użyć nazwy SPN jako tożsamości usługi. Aby uzyskać więcej informacji na temat narzędzia, zobacz Setspn Overview (Omówienie programu Setspn).

Uwaga

Aby użyć typu poświadczeń systemu Windows bez negocjacji, konto użytkownika usługi musi mieć dostęp do nazwy SPN zarejestrowanej w domenie usługi Active Directory. Można to zrobić w następujący sposób:

  • Użyj konta NetworkService lub LocalSystem, aby uruchomić usługę. Ponieważ te konta mają dostęp do nazwy SPN maszyny, która jest ustanawiana podczas dołączania maszyny do domeny usługi Active Directory, program WCF automatycznie generuje odpowiedni element NAZWY SPN wewnątrz punktu końcowego usługi w metadanych usługi (WSDL).

  • Użyj dowolnego konta domeny usługi Active Directory, aby uruchomić usługę. W takim przypadku należy ustanowić nazwę SPN dla tego konta domeny, co można zrobić za pomocą narzędzia Setspn.exe. Po utworzeniu nazwy SPN dla konta usługi skonfiguruj usługę WCF, aby opublikować nazwę SPN na klientach usługi za pośrednictwem jego metadanych (WSDL). Odbywa się to przez ustawienie tożsamości punktu końcowego dla uwidocznionego punktu końcowego za pośrednictwem pliku konfiguracji aplikacji lub kodu.

Aby uzyskać więcej informacji na temat nazw SPN, protokołu Kerberos i usługi Active Directory, zobacz Dodatek techniczny protokołu Kerberos dla systemu Windows.

Gdy nazwa SPN lub nazwa UPN jest równa pustemu ciągowi

Jeśli ustawisz nazwę SPN lub nazwę UPN równą pustym ciągowi, wystąpi wiele różnych rzeczy, w zależności od używanego poziomu zabezpieczeń i trybu uwierzytelniania:

  • Jeśli używasz zabezpieczeń na poziomie transportu, wybrano uwierzytelnianie NT LanMan (NTLM).

  • Jeśli używasz zabezpieczeń na poziomie komunikatów, uwierzytelnianie może zakończyć się niepowodzeniem w zależności od trybu uwierzytelniania:

  • Jeśli używasz spnego trybu, a AllowNtlm atrybut jest ustawiony na falsewartość , uwierzytelnianie nie powiedzie się.

  • Jeśli używasz spnego trybu i AllowNtlm atrybut jest ustawiony na true, uwierzytelnianie zakończy się niepowodzeniem, jeśli nazwa UPN jest pusta, ale powiedzie się, jeśli nazwa SPN jest pusta.

  • Jeśli używasz bezpośredniego protokołu Kerberos (nazywanego również "jednym strzałem"), uwierzytelnianie nie powiedzie się.

<Używanie elementu identity> w konfiguracji

Jeśli zmienisz typ poświadczeń klienta w powiązaniu pokazanym wcześniej na Certificate, 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 w razie potrzeby program WCF umożliwia określenie tożsamości w punkcie końcowym. 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

Zobacz też