Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Personifikacja jest typową techniką, która używa usług w celu ograniczenia dostępu klienta do zasobów domeny usługi. Zasoby domeny usługi mogą być zasobami komputera, na przykład plikami lokalnymi (podszywanie się), lub zasobem na innym komputerze, takim jak zasób plików (delegowanie). Aby zapoznać się z przykładową aplikacją, zobacz Personifikacja klienta. Przykład użycia personifikacji można znaleźć w temacie How to: Impersonate a Client on a Service (Jak personifikować klienta w usłudze).
Ważne
Należy pamiętać, że podczas personifikacji klienta w usłudze usługa jest uruchamiana przy użyciu poświadczeń klienta, które mogą mieć wyższe uprawnienia niż proces serwera.
Przegląd
Zazwyczaj klienci dzwonią do usługi, aby usługa wykonała jakąś akcję w imieniu klienta. Personifikacja umożliwia usłudze działanie jako klient podczas wykonywania akcji. Delegowanie umożliwia usłudze front-end przekazywanie żądania klienta do usługi back-end w taki sposób, że usługa back-end może również podszywać się pod klienta. Personifikacja jest najczęściej używana jako sposób sprawdzania, czy klient jest autoryzowany do wykonania konkretnej akcji, podczas gdy delegowanie jest sposobem przepływu możliwości personifikacji, wraz z tożsamością klienta, do usługi zaplecza. Delegowanie to funkcja domeny systemu Windows, która może być używana podczas uwierzytelniania opartego na protokole Kerberos. Delegowanie różni się od przepływu tożsamości i, ponieważ delegowanie przenosi możliwość personifikacji klienta bez posiadania hasła klienta, jest to znacznie wyższa operacja uprzywilejowana niż przepływ tożsamości.
Zarówno personifikacja, jak i delegowanie wymagają, aby klient miał tożsamość systemu Windows. Jeśli klient nie ma tożsamości systemu Windows, jedyną dostępną opcją jest przepływ tożsamości klienta do drugiej usługi.
Podstawy personifikacji
Program Windows Communication Foundation (WCF) obsługuje personifikację dla różnych poświadczeń klienta. W tym temacie opisano obsługę modelu usług w celu personifikacji obiektu wywołującego podczas implementacji metody usługi. Omówione są również typowe scenariusze wdrażania obejmujące personifikację oraz opcje zabezpieczeń protokołu SOAP i WCF w tych scenariuszach.
Ten temat koncentruje się na personifikacji i delegowaniu w programie WCF podczas korzystania z zabezpieczeń protokołu SOAP. Podczas korzystania z zabezpieczeń transportu można również użyć personifikacji i delegowania w programie WCF, zgodnie z opisem w temacie Using Impersonation with Transport Security (Używanie personifikacji z zabezpieczeniami transportu).
Dwie metody
Zabezpieczenia WCF SOAP mają dwie odrębne metody podszywania się. Użyta metoda zależy od powiązania. Jednym z nich jest podszywanie się za pomocą tokenu Windows uzyskanego z interfejsu Security Support Provider Interface (SSPI) lub uwierzytelniania Kerberos, który jest następnie buforowany w usłudze. Drugi to podszywanie się z tokenu systemu Windows uzyskanego z rozszerzeń protokołu Kerberos, zbiorczo nazywanych Service-for-User (S4U).
Personifikacja buforowanego tokenu
Możesz wykonać personifikację buforowanego tokenu przy użyciu następujących elementów:
WSHttpBinding, WSDualHttpBindingi NetTcpBinding przy użyciu poświadczeń klienta systemu Windows.
BasicHttpBinding z BasicHttpSecurityMode zestawem TransportWithMessageCredential poświadczenia lub innym standardowym powiązaniem, w którym klient przedstawia poświadczenie nazwy użytkownika, które usługa może odwzorować na prawidłowe konto systemu Windows.
Każdy CustomBinding, który używa poświadczeń klienta systemu Windows z ustawionym
requireCancellation
natrue
. (Właściwość jest dostępna w następujących klasach: SecureConversationSecurityTokenParameters, SslSecurityTokenParametersi SspiSecurityTokenParameters.) Jeśli bezpieczna konwersacja jest używana w powiązaniu, musi również mieć właściwość ustawionąrequireCancellation
natrue
.Każde CustomBinding, gdzie klient przedstawia poświadczenie nazwy użytkownika. Jeśli bezpieczna konwersacja jest używana w powiązaniu, musi również mieć właściwość ustawioną
requireCancellation
natrue
.
S4U-Based Podszywanie się
Personifikację opartą na protokole S4U można wykonać przy użyciu następujących elementów:
WSHttpBinding, WSDualHttpBinding i NetTcpBinding z użyciem poświadczenia klienta certyfikatu, które usługa może mapować na prawidłowe konto systemu Windows.
Każdy CustomBinding, który używa poświadczeń klienta systemu Windows z ustawioną właściwością
requireCancellation
nafalse
.Każda CustomBinding, która używa nazwy użytkownika lub poświadczeń klienta systemu Windows i zabezpiecza konwersację, mając właściwość
requireCancellation
ustawioną nafalse
.
Zakres, w jakim usługa może personifikować klienta, zależy od uprawnień, które posiada konto usługi podczas próby personifikacji, typu personifikacji użytej i ewentualnie zakresu personifikacji, na którą zezwala klient.
Uwaga / Notatka
Gdy klient i usługa są uruchomione na tym samym komputerze, a klient jest uruchomiony na koncie systemowym (na przykład Local System
lub Network Service
), klient nie może być personifikowany, gdy zostanie nawiązana bezpieczna sesja z stanowymi tokenami kontekstu zabezpieczeń. Formularz systemu Windows lub aplikacja konsolowa zazwyczaj działa na aktualnie zalogowanym koncie, dzięki czemu konto może być domyślnie personifikowane. Jeśli jednak klient jest stroną ASP.NET, a ta strona jest hostowana w usługach IIS 6.0 lub IIS 7.0, klient działa domyślnie na Network Service
koncie. Wszystkie powiązania dostarczone przez system, które obsługują bezpieczne sesje, domyślnie używają bezstanowego tokenu kontekstu zabezpieczeń (SCT). Jeśli jednak klient jest stroną ASP.NET, a używane są bezpieczne sesje ze stanowymi SCT, nie można się podszywać pod klienta. Aby uzyskać więcej informacji na temat używania stanowych SCT w bezpiecznej sesji, zobacz Jak utworzyć token kontekstu zabezpieczeń dla bezpiecznej sesji.
Personifikacja w metodzie usługi: model deklaratywny
Większość scenariuszy personifikacji obejmuje wykonywanie metody usługi w kontekście wywołującego. Program WCF udostępnia funkcję personifikacji, która ułatwia wykonanie tej czynności, umożliwiając użytkownikowi określenie wymagania personifikacji w atrybucie OperationBehaviorAttribute . Na przykład w poniższym kodzie infrastruktura WCF przyjmuje tożsamość wywołującego przed wykonaniem Hello
metody. Każda próba uzyskania dostępu do zasobów natywnych wewnątrz Hello
metody powiedzie się tylko wtedy, gdy lista kontroli dostępu (ACL) zasobu zezwala na uprawnienia dostępu wywołującego. Aby włączyć impersonację, ustaw właściwość Impersonation na jedną z wartości wyliczenia ImpersonationOption, albo ImpersonationOption.RequiredImpersonationOption.Allowed, jak pokazano w poniższym przykładzie.
Uwaga / Notatka
Jeśli usługa ma wyższe poświadczenia niż klient zdalny, to poświadczenia usługi są używane, jeśli właściwość Impersonation jest ustawiona na Allowed. Oznacza to, że jeśli użytkownik o niskich uprawnieniach udostępnia swoje poświadczenia, usługa z wyższymi uprawnieniami wykonuje metodę z poświadczeniami usługi i może używać zasobów, których użytkownik o niskich uprawnieniach w przeciwnym razie nie będzie mógł używać.
[ServiceContract]
public interface IHelloContract
{
[OperationContract]
string Hello(string message);
}
public class HelloService : IHelloService
{
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string Hello(string message)
{
return "hello";
}
}
<ServiceContract()> _
Public Interface IHelloContract
<OperationContract()> _
Function Hello(ByVal message As String) As String
End Interface
Public Class HelloService
Implements IHelloService
<OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
Public Function Hello(ByVal message As String) As String Implements IHelloService.Hello
Return "hello"
End Function
End Class
Infrastruktura WCF może podszywać się pod dzwoniącego tylko wtedy, gdy użytkownik jest uwierzytelniany przy użyciu poświadczeń, które można przypisać do konta użytkownika systemu Windows. Jeśli usługa jest skonfigurowana do uwierzytelniania przy użyciu poświadczeń, których nie można zamapować na konto systemu Windows, metoda usługi nie jest wykonywana.
Uwaga / Notatka
W systemie Windows XP personifikacja kończy się niepowodzeniem w przypadku utworzenia stanowego SCT, co powoduje wystąpienie błędu InvalidOperationException. Aby uzyskać więcej informacji, zobacz Nieobsługiwane scenariusze.
Podszywanie się w metodzie serwisowej: Model imperatywny
Czasami obiekt wywołujący nie musi podszywać się pod całą metodę usługi, aby działać, ale tylko jej część. W takim przypadku uzyskaj tożsamość systemu Windows dzwoniącego wewnątrz metody usługi i imperatywnie wykonaj impersonację. W tym celu należy użyć właściwości WindowsIdentity obiektu ServiceSecurityContext do zwrócenia instancji klasy WindowsIdentity oraz wywołać metodę Impersonate przed użyciem tej instancji.
Uwaga / Notatka
Pamiętaj, aby automatycznie przywrócić akcję personifikacji przy użyciu instrukcji Visual BasicUsing
lub instrukcji języka C# using
. Jeśli nie używasz instrukcji lub jeśli używasz języka programowania innego niż Visual Basic lub C#, pamiętaj, aby przywrócić poziom personifikacji. Niewykonanie tej czynności może stanowić podstawę ataków typu "odmowa usługi" i "podniesienie uprawnień".
public class HelloService : IHelloService
{
[OperationBehavior]
public string Hello(string message)
{
WindowsIdentity callerWindowsIdentity =
ServiceSecurityContext.Current.WindowsIdentity;
if (callerWindowsIdentity == null)
{
throw new InvalidOperationException
("The caller cannot be mapped to a WindowsIdentity");
}
using (callerWindowsIdentity.Impersonate())
{
// Access a file as the caller.
}
return "Hello";
}
}
Public Class HelloService
Implements IHelloService
<OperationBehavior()> _
Public Function Hello(ByVal message As String) As String _
Implements IHelloService.Hello
Dim callerWindowsIdentity As WindowsIdentity = _
ServiceSecurityContext.Current.WindowsIdentity
If (callerWindowsIdentity Is Nothing) Then
Throw New InvalidOperationException( _
"The caller cannot be mapped to a WindowsIdentity")
End If
Dim cxt As WindowsImpersonationContext = callerWindowsIdentity.Impersonate()
Using (cxt)
' Access a file as the caller.
End Using
Return "Hello"
End Function
End Class
Personifikacja dla wszystkich metod usługi
W niektórych przypadkach należy wykonać wszystkie metody usługi w kontekście obiektu wywołującego. Zamiast jawnie włączać tę funkcję dla poszczególnych metod, użyj elementu ServiceAuthorizationBehavior. Jak pokazano w poniższym kodzie, ustaw właściwość ImpersonateCallerForAllOperations na true
. Element ServiceAuthorizationBehavior jest pobierany z kolekcji zachowań ServiceHost klasy . Należy również pamiętać, że Impersonation
właściwość OperationBehaviorAttribute zastosowana do każdej metody musi być ustawiona na Allowed lub Required.
// Code to create a ServiceHost not shown.
ServiceAuthorizationBehavior MyServiceAuthorizationBehavior =
serviceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
MyServiceAuthorizationBehavior.ImpersonateCallerForAllOperations = true;
' Code to create a ServiceHost not shown.
Dim MyServiceAuthorizationBehavior As ServiceAuthorizationBehavior
MyServiceAuthorizationBehavior = serviceHost.Description.Behaviors.Find _
(Of ServiceAuthorizationBehavior)()
MyServiceAuthorizationBehavior.ImpersonateCallerForAllOperations = True
W poniższej tabeli opisano zachowanie WCF dla wszystkich możliwych kombinacji elementów ImpersonationOption
i ImpersonateCallerForAllServiceOperations
.
ImpersonationOption |
ImpersonateCallerForAllServiceOperations |
Zachowanie |
---|---|---|
Wymagane | N/a | WCF używa tożsamości dzwoniącego |
Dozwolone | fałszywy | WCF nie podszywa się pod wywołującego |
Dozwolone | prawda | WCF używa tożsamości dzwoniącego |
Niedozwolone | fałszywy | WCF nie podszywa się pod wywołującego |
Niedozwolone | prawda | Niedozwolone. (Rzucany jest wyjątek InvalidOperationException.) |
Poziom personifikacji uzyskany z poświadczeń systemu Windows i personifikacja buforowanego tokenu
W niektórych scenariuszach klient ma częściową kontrolę nad poziomem impersonacji usługi, która jest wykonywana, gdy używane są poświadczenia klienta systemu Windows. Jeden scenariusz występuje, gdy klient określa poziom personifikacji anonimowej. Drugi występuje podczas podszywania się za pomocą buforowanego tokenu. W tym celu należy ustawić właściwość AllowedImpersonationLevel klasy WindowsClientCredential, która jest dostępna jako właściwość klasy szablonowej ChannelFactory<TChannel>.
Uwaga / Notatka
Określenie poziomu personifikacji anonimowego powoduje, że klient loguje się anonimowo do usługi. W związku z tym usługa musi zezwalać na logowanie anonimowe, niezależnie od tego, czy jest wykonywane personifikacja.
Klient może określić poziom personifikacji jako Anonymous, , IdentificationImpersonationlub Delegation. Generowany jest tylko token na określonym poziomie, jak pokazano w poniższym kodzie.
ChannelFactory<IEcho> cf = new ChannelFactory<IEcho>("EchoEndpoint");
cf.Credentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Impersonation;
Dim cf As ChannelFactory(Of IEcho) = New ChannelFactory(Of IEcho)("EchoEndpoint")
cf.Credentials.Windows.AllowedImpersonationLevel = _
System.Security.Principal.TokenImpersonationLevel.Impersonation
W poniższej tabeli określono poziom personifikacji, który usługa uzyskuje podczas personifikacji z buforowanego tokenu.
AllowedImpersonationLevel wartość |
Usługa ma SeImpersonatePrivilege |
Usługa i klient mają zdolność do delegowania | Token buforowany ImpersonationLevel |
---|---|---|---|
Anonim | Tak | N/a | Personifikacja |
Anonim | Nie. | N/a | Identyfikacja |
Identyfikacja | N/a | N/a | Identyfikacja |
Personifikacja | Tak | N/a | Personifikacja |
Personifikacja | Nie. | N/a | Identyfikacja |
Delegowanie | Tak | Tak | Delegowanie |
Delegowanie | Tak | Nie. | Personifikacja |
Delegowanie | Nie. | N/a | Identyfikacja |
Poziom personifikacji uzyskany z poświadczeń nazwy użytkownika i personifikacji tokenu w pamięci podręcznej
Przekazując nazwę użytkownika i hasło do usługi, klient umożliwia usłudze WCF logowanie się jako ten użytkownik, co jest równoważne ustawieniu właściwości AllowedImpersonationLevel
na Delegation. (Element AllowedImpersonationLevel
jest dostępny w klasach WindowsClientCredential i HttpDigestClientCredential). W poniższej tabeli przedstawiono poziom podszywania się uzyskany, gdy usługa otrzyma poświadczenia nazwy użytkownika.
AllowedImpersonationLevel |
Usługa ma SeImpersonatePrivilege |
Usługa i klient mają zdolność do delegowania | Token buforowany ImpersonationLevel |
---|---|---|---|
N/a | Tak | Tak | Delegowanie |
N/a | Tak | Nie. | Personifikacja |
N/a | Nie. | N/a | Identyfikacja |
Poziom impersonacji uzyskany z impersonacji S4U-Based
Usługa ma SeTcbPrivilege |
Usługa ma SeImpersonatePrivilege |
Usługa i klient mają zdolność do delegowania | Token buforowany ImpersonationLevel |
---|---|---|---|
Tak | Tak | N/a | Personifikacja |
Tak | Nie. | N/a | Identyfikacja |
Nie. | N/a | N/a | Identyfikacja |
Mapowanie certyfikatu klienta na konto systemu Windows
Klient może uwierzytelnić się w usłudze przy użyciu certyfikatu, a usługa może przypisać go do istniejącego konta za pośrednictwem Active Directory. Poniższy kod XML pokazuje, jak skonfigurować usługę do mapowania certyfikatu.
<behaviors>
<serviceBehaviors>
<behavior name="MapToWindowsAccount">
<serviceCredentials>
<clientCertificate>
<authentication mapClientCertificateToWindowsAccount="true" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
Poniższy kod pokazuje, jak skonfigurować usługę.
// Create a binding that sets a certificate as the client credential type.
WSHttpBinding b = new WSHttpBinding();
b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
// Create a service host that maps the certificate to a Windows account.
Uri httpUri = new Uri("http://localhost/Calculator");
ServiceHost sh = new ServiceHost(typeof(HelloService), httpUri);
sh.Credentials.ClientCertificate.Authentication.MapClientCertificateToWindowsAccount = true;
Delegowanie
Aby przekazać do usługi zaplecza, usługa musi wykonać wieloczęściowe uwierzytelnianie za pomocą protokołu Kerberos (SSPI bez protokołu awaryjnego NTLM) lub bezpośrednie uwierzytelnianie Kerberos do usługi zaplecza, używając tożsamości systemu Windows klienta. Aby delegować do usługi zaplecza, utwórz ChannelFactory<TChannel> oraz kanał, a następnie przekaż za pośrednictwem kanału, podszywając się pod klienta. W przypadku tej formy delegowania odległość, w jakiej może znajdować się usługa back-end od usługi front-end, zależy od poziomu impersonacji osiągniętego przez usługę front-end. Gdy poziom personifikacji to Impersonation, usługi frontendowe i backendowe muszą działać na tej samej maszynie. Gdy poziom personifikacji to Delegation, usługi front-end i back-end mogą znajdować się na oddzielnych maszynach lub na tej samej maszynie. Włączenie personifikacji na poziomie delegowania wymaga skonfigurowania zasad domeny systemu Windows w celu zezwolenia na delegowanie. Aby uzyskać więcej informacji na temat konfigurowania usługi Active Directory na potrzeby obsługi delegowania, zobacz Włączanie uwierzytelniania delegowanego.
Uwaga / Notatka
Gdy klient uwierzytelnia się w usłudze front-end przy użyciu nazwy użytkownika i hasła odpowiadającej kontu systemu Windows w usłudze back-end, usługa front-end może uwierzytelniać się w usłudze back-end, ponownie używając nazwy użytkownika i hasła klienta. Jest to szczególnie zaawansowana forma przepływu tożsamości, ponieważ przekazywanie nazwy użytkownika i hasła do usługi zaplecza umożliwia usłudze zaplecza wykonywanie personifikacji, ale nie stanowi delegowania, ponieważ protokół Kerberos nie jest używany. Kontrolki usługi Active Directory dotyczące delegowania nie mają zastosowania do nazwy użytkownika i uwierzytelniania haseł.
Umiejętność delegowania jako funkcja poziomu personifikacji
Poziom personifikacji | Usługa może wykonywać delegowanie między procesami | Usługa może wykonywać delegowanie między maszynami |
---|---|---|
Identification | Nie. | Nie. |
Impersonation | Tak | Nie. |
Delegation | Tak | Tak |
W poniższym przykładzie kodu pokazano, jak używać delegowania.
public class HelloService : IHelloService
{
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string Hello(string message)
{
WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity;
if (callerWindowsIdentity == null)
{
throw new InvalidOperationException
("The caller cannot be mapped to a Windows identity.");
}
using (callerWindowsIdentity.Impersonate())
{
EndpointAddress backendServiceAddress = new EndpointAddress("http://localhost:8000/ChannelApp");
// Any binding that performs Windows authentication of the client can be used.
ChannelFactory<IHelloService> channelFactory = new ChannelFactory<IHelloService>(new NetTcpBinding(), backendServiceAddress);
IHelloService channel = channelFactory.CreateChannel();
return channel.Hello(message);
}
}
}
Public Class HelloService
Implements IHelloService
<OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
Public Function Hello(ByVal message As String) As String Implements IHelloService.Hello
Dim callerWindowsIdentity As WindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity
If (callerWindowsIdentity Is Nothing) Then
Throw New InvalidOperationException("The caller cannot be mapped to a Windows identity.")
End If
Dim backendServiceAddress As EndpointAddress = New EndpointAddress("http://localhost:8000/ChannelApp")
' Any binding that performs Windows authentication of the client can be used.
Dim channelFactory As ChannelFactory(Of IHelloService) = _
New ChannelFactory(Of IHelloService)(New NetTcpBinding(), backendServiceAddress)
Dim channel As IHelloService = channelFactory.CreateChannel()
Return channel.Hello(message)
End Function
End Class
Jak skonfigurować aplikację do używania ograniczonego delegowania
Aby można było użyć ograniczonego delegowania, nadawca, odbiornik i kontroler domeny muszą być skonfigurowane w tym celu. Poniższa procedura zawiera listę kroków, które umożliwiają ograniczone delegowanie. Aby uzyskać szczegółowe informacje na temat różnic między delegowaniem a delegowaniem ograniczonym, zobacz część rozszerzeń Protokołu Kerberos systemu Windows Server 2003 , które omawiają ograniczone dyskusje.
Na kontrolerze domeny wyczyść pole wyboru Konto jest poufne i nie można go delegować dla konta, w którym działa aplikacja kliencka.
Na kontrolerze domeny zaznacz pole wyboru Konto jest zaufane dla delegowania dla konta, w którym działa aplikacja kliencka.
Na kontrolerze domeny skonfiguruj komputer warstwy środkowej, aby był zaufany dla delegowania, klikając opcję Ufaj komputerowi na potrzeby delegowania .
Na kontrolerze domeny skonfiguruj komputer warstwy środkowej tak, aby używał ograniczonego delegowania, klikając opcję Ufaj temu komputerowi dla delegowania tylko do określonych usług .
Aby uzyskać bardziej szczegółowe instrukcje dotyczące konfigurowania ograniczonego delegowania, zobacz Przejście protokołu Kerberos i ograniczone delegowanie.
Zobacz także
- OperationBehaviorAttribute
- Impersonation
- ImpersonationOption
- WindowsIdentity
- ServiceSecurityContext
- WindowsIdentity
- ServiceAuthorizationBehavior
- ImpersonateCallerForAllOperations
- ServiceHost
- AllowedImpersonationLevel
- WindowsClientCredential
- ChannelFactory<TChannel>
- Identification
- Używanie podszywania się z zabezpieczeniami transportowymi
- Podszywanie się pod klienta
- Instrukcje: personifikacja klienta w usłudze
- Narzędzie do obsługi metadanych elementu ServiceModel (Svcutil.exe)