Delegace a zosobnění se službou WCF
Zosobnění je běžná technika, kterou služby používají k omezení přístupu klientů k prostředkům domény služby. Prostředky domény služby můžou být buď prostředky počítače, jako jsou místní soubory (zosobnění), nebo prostředek na jiném počítači, například sdílená složka (delegování). Ukázkovou aplikaci najdete v tématu Zosobnění klienta. Příklad použití zosobnění najdete v tématu Postupy: Zosobnění klienta ve službě.
Důležité
Mějte na paměti, že při zosobnění klienta ve službě se služba spouští s přihlašovacími údaji klienta, které můžou mít vyšší oprávnění než proces serveru.
Přehled
Klienti obvykle volají službu, aby služba prováděla nějakou akci jménem klienta. Zosobnění umožňuje službě při provádění akce jednat jako klient. Delegování umožňuje front-endové službě předat požadavek klienta back-endové službě tak, aby back-endová služba také zosobněla klienta. Zosobnění se nejčastěji používá jako způsob kontroly, jestli má klient oprávnění provádět konkrétní akci, zatímco delegování je způsob, jak tok funkcí zosobnění spolu s identitou klienta do back-endové služby. Delegování je funkce domény Systému Windows, která se dá použít při ověřování založeném na protokolu Kerberos. Delegování se liší od toku identity a protože delegování přenáší schopnost zosobnit klienta bez vlastnictví hesla klienta, jedná se o mnohem vyšší privilegovanou operaci než tok identity.
Zosobnění i delegování vyžadují, aby měl klient identitu Windows. Pokud klient nemá identitu Systému Windows, jedinou dostupnou možností je tok identity klienta do druhé služby.
Základy zosobnění
Windows Communication Foundation (WCF) podporuje zosobnění pro různé přihlašovací údaje klienta. Toto téma popisuje podporu modelu služby pro zosobnění volajícího během implementace metody služby. Probírané jsou také běžné scénáře nasazení zahrnující zosobnění a zabezpečení SOAP a možnosti WCF v těchto scénářích.
Toto téma se zaměřuje na zosobnění a delegování ve WCF při použití zabezpečení PROTOKOLU SOAP. Při použití zabezpečení přenosu můžete také použít zosobnění a delegování s WCF, jak je popsáno v tématu Použití zosobnění se zabezpečením přenosu.
Dvě metody
Zabezpečení PROTOKOLU SOAP WCF má dvě odlišné metody pro provádění zosobnění. Použitá metoda závisí na vazbě. Jedním z nich je zosobnění z tokenu Windows získaného z rozhraní SSPI (Security Support Provider Interface) nebo ověřování Kerberos, které se pak ukládá do mezipaměti ve službě. Druhým je zosobnění z tokenu Windows získaného z rozšíření Kerberos, souhrnně označovaného jako Service-for-User (S4U).
Zosobnění tokenu v mezipaměti
Zosobnění tokenu v mezipaměti můžete provést takto:
WSHttpBindingNetTcpBinding a WSDualHttpBindings přihlašovacími údaji klienta systému Windows.
BasicHttpBindings nastavenými TransportWithMessageCredential přihlašovacími údaji nebo jakoukoli jinou BasicHttpSecurityMode standardní vazbou, ve které klient prezentuje přihlašovací údaje uživatelského jména, které může služba mapovat na platný účet Systému Windows.
VšechnyCustomBinding, které používají přihlašovací údaje klienta systému Windows se nastavenou na
true
requireCancellation
hodnotu . (Vlastnost je k dispozici v následujících třídách: SecureConversationSecurityTokenParameters, SslSecurityTokenParametersa SspiSecurityTokenParameters.) Pokud se v vazbě používá zabezpečená konverzace, musí mít vlastnost nastavenourequireCancellation
také natrue
hodnotu .Libovolné CustomBinding místo, kde klient prezentuje přihlašovací údaje uživatelského jména. Pokud se pro vazbu používá zabezpečená konverzace, musí mít vlastnost nastavenou
requireCancellation
také natrue
hodnotu .
Zosobnění na základě S4U
Zosobnění na základě S4U můžete provést takto:
WSHttpBinding, WSDualHttpBindinga NetTcpBinding s přihlašovacími údaji klienta certifikátu, které může služba mapovat na platný účet Systému Windows.
Všechny CustomBinding , které používají přihlašovací údaje klienta systému Windows s vlastností nastavenou
requireCancellation
nafalse
.Všechny CustomBinding , které používají uživatelské jméno nebo přihlašovací údaje klienta systému Windows a zabezpečenou konverzaci s vlastností nastavenou
requireCancellation
nafalse
.
Rozsah, do kterého může služba zosobnit klienta, závisí na oprávněních, která účet služby uchovává při pokusu o zosobnění, typu zosobnění použitého a případně rozsahu zosobnění, které klient povoluje.
Poznámka:
Když klient a služba běží na stejném počítači a klient běží pod systémovým účtem (například Local System
nebo Network Service
), klient se nedá zosobnět, když je zabezpečená relace vytvořena se stavovými tokeny kontextu zabezpečení. Formulář windows nebo konzolová aplikace se obvykle spouští pod aktuálně přihlášeným účtem, aby se tento účet mohl zosobnět ve výchozím nastavení. Pokud je však klient stránkou ASP.NET a tato stránka je hostovaná ve službě IIS 6.0 nebo IIS 7.0, klient se ve výchozím nastavení spustí pod účtem Network Service
. Všechny systémové vazby, které podporují zabezpečené relace, ve výchozím nastavení používají bezstavový token kontextu zabezpečení (SCT). Pokud je však klient stránkou ASP.NET a používají se zabezpečené relace se stavovými scty, klient se nedá zosobnět. Další informace o použití stavových SCT v zabezpečené relaci naleznete v tématu Postupy: Vytvoření tokenu kontextu zabezpečení pro zabezpečenou relaci.
Zosobnění v metodě služby: Deklarativní model
Většina scénářů zosobnění zahrnuje spuštění metody služby v kontextu volajícího. WCF poskytuje funkci zosobnění, která usnadňuje práci tím, že uživateli umožňuje zadat požadavek zosobnění v atributu OperationBehaviorAttribute . Například v následujícím kódu zosobňuje infrastruktura WCF volajícího před spuštěním Hello
metody. Jakýkoli pokus o přístup k nativním prostředkům uvnitř Hello
metody bude úspěšný pouze v případě, že seznam řízení přístupu (ACL) prostředku umožňuje přístupová oprávnění volajícího. Chcete-li povolit zosobnění, nastavte Impersonation vlastnost na jednu z hodnot výčtu ImpersonationOption , buď ImpersonationOption.Required nebo ImpersonationOption.Allowed, jak je znázorněno v následujícím příkladu.
Poznámka:
Pokud má služba vyšší přihlašovací údaje než vzdálený klient, použijí se přihlašovací údaje služby, pokud Impersonation je vlastnost nastavena na Allowed. To znamená, že pokud uživatel s nízkou úrovní oprávnění poskytne své přihlašovací údaje, služba s vyššími oprávněními spustí metodu s přihlašovacími údaji služby a může používat prostředky, které by jinak uživatel s nízkou úrovní oprávnění nemohl použít.
[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 může zosobnit volajícího pouze v případě, že je volající ověřený pomocí přihlašovacích údajů, které lze mapovat na uživatelský účet systému Windows. Pokud je služba nakonfigurovaná tak, aby se ověřila pomocí přihlašovacích údajů, které nelze namapovat na účet Systému Windows, metoda služby se nespustí.
Poznámka:
V systému Windows XP se zosobnění nezdaří, pokud je vytvořen stavový SCT, což vede k .InvalidOperationException Další informace najdete v tématu Nepodporované scénáře.
Zosobnění v metodě služby: Imperativní model
Někdy volající nemusí zosobnit celou metodu služby, ale jenom pro jeho část. V tomto případě získejte identitu windows volajícího uvnitř metody služby a imperativní provedení zosobnění. Proveďte to pomocí WindowsIdentity vlastnosti vrácení instance WindowsIdentity třídy a volání Impersonate metody ServiceSecurityContext před použitím instance.
Poznámka:
Nezapomeňte použít příkaz jazyka Visual BasicUsing
nebo příkaz jazyka C# using
k automatickému vrácení akce zosobnění. Pokud příkaz nepoužíváte nebo pokud používáte jiný programovací jazyk než Jazyk Visual Basic nebo C#, nezapomeňte vrátit úroveň zosobnění. Pokud to neuděláte, může to tvořit základ pro útoky na odepření služby a zvýšení oprávnění.
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
Zosobnění pro všechny metody služby
V některých případech musíte provést všechny metody služby v kontextu volajícího. Místo explicitního povolení této funkce pro jednotlivé metody použijte ServiceAuthorizationBehavior. Jak je znázorněno v následujícím kódu, nastavte ImpersonateCallerForAllOperations vlastnost na true
. Načítá ServiceAuthorizationBehavior se z kolekcí ServiceHost chování třídy. Všimněte si také, že Impersonation
vlastnost použité pro každou metodu OperationBehaviorAttribute musí být také nastavena na buď Allowed nebo 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
Následující tabulka popisuje chování WCF pro všechny možné kombinace ImpersonationOption
a ImpersonateCallerForAllServiceOperations
.
ImpersonationOption |
ImpersonateCallerForAllServiceOperations |
Chování |
---|---|---|
Požaduje se | Není k dispozici | Zosobnění volajícího WCF |
Povoleno | false (nepravda) | WCF nezosobní volajícího |
Povoleno | true | Zosobnění volajícího WCF |
NotAllowed | false (nepravda) | WCF nezosobní volajícího |
NotAllowed | true | Zakázány. (Vyvolá se chyba InvalidOperationException .) |
Úroveň zosobnění získaná z přihlašovacích údajů systému Windows a zosobnění tokenu v mezipaměti
V některých scénářích má klient částečnou kontrolu nad úrovní zosobnění, kterou služba provádí při použití přihlašovacích údajů klienta systému Windows. Jeden scénář nastane, když klient určuje úroveň anonymní zosobnění. K druhému dochází při provádění zosobnění s tokenem v mezipaměti. To se provádí nastavením AllowedImpersonationLevel vlastnosti WindowsClientCredential třídy, která je přístupná jako vlastnost obecné ChannelFactory<TChannel> třídy.
Poznámka:
Určení úrovně zosobnění anonymního objektu způsobí, že se klient přihlásí ke službě anonymně. Služba proto musí povolit anonymní přihlášení bez ohledu na to, jestli se provádí zosobnění.
Klient může určit úroveň zosobnění jako Anonymous, Identification, Impersonationnebo Delegation. Vytvoří se pouze token na zadané úrovni, jak je znázorněno v následujícím kódu.
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
Následující tabulka určuje úroveň zosobnění, které služba získá při zosobnění z tokenu v mezipaměti.
AllowedImpersonationLevel Hodnotu |
Služba má SeImpersonatePrivilege |
Služba a klient jsou schopné delegování | Token uložený v mezipaměti ImpersonationLevel |
---|---|---|---|
Anonymní | Yes | Není k dispozici | Zosobnění |
Anonymní | No | Není k dispozici | Identifikace |
Identifikace | Není k dispozici | Není k dispozici | Identifikace |
Zosobnění | Yes | Není k dispozici | Zosobnění |
Zosobnění | No | Není k dispozici | Identifikace |
Delegování | Ano | Yes | Delegování |
Delegování | Yes | No | Zosobnění |
Delegování | No | Není k dispozici | Identifikace |
Úroveň zosobnění získaná z přihlašovacích údajů uživatelského jména a zosobnění tokenu v mezipaměti
Předáním uživatelského jména a hesla služby klient umožňuje WCF přihlásit se jako tento uživatel, což je ekvivalentní nastavení AllowedImpersonationLevel
vlastnosti na Delegation. (Je AllowedImpersonationLevel
k dispozici v předmětech WindowsClientCredential a HttpDigestClientCredential třídách.) Následující tabulka obsahuje úroveň zosobnění získanou při přijetí přihlašovacích údajů uživatelského jména.
AllowedImpersonationLevel |
Služba má SeImpersonatePrivilege |
Služba a klient jsou schopné delegování | Token uložený v mezipaměti ImpersonationLevel |
---|---|---|---|
Není k dispozici | Ano | Yes | Delegování |
Není k dispozici | Yes | No | Zosobnění |
Není k dispozici | No | Není k dispozici | Identifikace |
Úroveň zosobnění získaná z zosobnění na základě S4U
Služba má SeTcbPrivilege |
Služba má SeImpersonatePrivilege |
Služba a klient jsou schopné delegování | Token uložený v mezipaměti ImpersonationLevel |
---|---|---|---|
Ano | Yes | Není k dispozici | Zosobnění |
Yes | No | Není k dispozici | Identifikace |
No | – | Není k dispozici | Identifikace |
Mapování klientského certifikátu na účet Systému Windows
Je možné, aby se klient ověřil ve službě pomocí certifikátu a aby služba mapovala klienta na existující účet prostřednictvím služby Active Directory. Následující kód XML ukazuje, jak nakonfigurovat službu pro mapování certifikátu.
<behaviors>
<serviceBehaviors>
<behavior name="MapToWindowsAccount">
<serviceCredentials>
<clientCertificate>
<authentication mapClientCertificateToWindowsAccount="true" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
Následující kód ukazuje, jak nakonfigurovat službu.
// 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;
Delegování
Aby bylo možné delegovat na back-endovou službu, musí služba provádět vícenožitý protokol Kerberos (SSPI bez náhradní lokality NTLM) nebo přímé ověřování Kerberos back-endové službě pomocí identity klienta systému Windows. Pokud chcete delegovat na back-endovou službu, vytvořte a ChannelFactory<TChannel> kanál a komunikujte prostřednictvím kanálu při zosobnění klienta. Díky této formě delegování závisí vzdálenost, ve které může být back-endová služba umístěna od front-endové služby, na úrovni zosobnění dosažené front-endovou službou. Pokud je Impersonationúroveň zosobnění , musí front-end a back-endové služby běžet na stejném počítači. Pokud je Delegationúroveň zosobnění , front-endové a back-endové služby můžou být na samostatných počítačích nebo na stejném počítači. Povolení zosobnění na úrovni delegování vyžaduje, aby byly zásady domény Windows nakonfigurované tak, aby povolovaly delegování. Další informace o konfiguraci služby Active Directory pro podporu delegování naleznete v tématu Povolení delegovaného ověřování.
Poznámka:
Když se klient ověří ve front-endové službě pomocí uživatelského jména a hesla, které odpovídají účtu Windows v back-end službě, může front-endová služba ověřit back-endovou službu opětovným použitím uživatelského jména a hesla klienta. Jedná se o obzvláště výkonnou formu toku identity, protože předávání uživatelského jména a hesla back-endové službě umožňuje back-endové službě provádět zosobnění, ale nepředstavuje delegování, protože protokol Kerberos se nepoužívá. Ovládací prvky služby Active Directory pro delegování se nevztahují na uživatelské jméno a ověřování hesla.
Schopnost delegování jako funkce úrovně zosobnění
Úroveň zosobnění | Služba může provádět delegování napříč procesy. | Služba může provádět delegování mezi počítači |
---|---|---|
Identification | No | No |
Impersonation | Ano | Ne |
Delegation | Ano | Yes |
Následující příklad kódu ukazuje, jak používat delegování.
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
Konfigurace aplikace pro použití omezeného delegování
Před použitím omezeného delegování je nutné nakonfigurovat odesílatele, příjemce a řadič domény. Následující postup uvádí kroky, které umožňují omezené delegování. Podrobnosti o rozdílech mezi delegování a omezeným delegování najdete v části rozšíření Kerberos systému Windows Server 2003, která popisuje omezené diskuze.
Na řadiči domény zrušte zaškrtnutí políčka Účet a nelze ho delegovat u účtu, ve kterém je spuštěná klientská aplikace.
Na řadiči domény zaškrtněte políčko Účet je důvěryhodný pro delegování pro účet, pod kterým je spuštěná klientská aplikace.
Na řadiči domény nakonfigurujte počítač střední vrstvy tak, aby byl důvěryhodný pro delegování, kliknutím na možnost Důvěřovat počítači pro delegování .
Na řadiči domény nakonfigurujte počítač střední vrstvy tak, aby používal omezené delegování, kliknutím na možnost Důvěřovat tomuto počítači pro delegování určeným službám.
Podrobnější pokyny ke konfiguraci omezeného delegování najdete v tématu Přechod protokolu Kerberos a omezené delegování.
Viz také
- OperationBehaviorAttribute
- Impersonation
- ImpersonationOption
- WindowsIdentity
- ServiceSecurityContext
- WindowsIdentity
- ServiceAuthorizationBehavior
- ImpersonateCallerForAllOperations
- ServiceHost
- AllowedImpersonationLevel
- WindowsClientCredential
- ChannelFactory<TChannel>
- Identification
- Použití zosobnění se zabezpečením přenosu
- Zosobnění klienta
- Postupy: Zosobnění klienta ve službě
- Nástroj metadat modelu služby (Svcutil.exe)