Sdílet prostřednictvím


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:

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 na false.

  • 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 na false.

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.

  1. 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.

  2. 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.

  3. 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í .

  4. 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é