Udostępnij za pośrednictwem


Delegowanie i personifikacja za pomocą programu WCF

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:

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

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

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.

  1. Na kontrolerze domeny wyczyść pole wyboru Konto jest poufne i nie można go delegować dla konta, w którym działa aplikacja kliencka.

  2. Na kontrolerze domeny zaznacz pole wyboru Konto jest zaufane dla delegowania dla konta, w którym działa aplikacja kliencka.

  3. Na kontrolerze domeny skonfiguruj komputer warstwy środkowej, aby był zaufany dla delegowania, klikając opcję Ufaj komputerowi na potrzeby delegowania .

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