Udostępnij za pośrednictwem


Personifikowanie klienta

W przykładzie Personifikacja pokazano, jak personifikować aplikację wywołującego w usłudze, aby usługa mogła uzyskać dostęp do zasobów systemowych w imieniu obiektu wywołującego.

Ten przykład jest oparty na przykładzie Self-Host . Pliki konfiguracji usługi i klienta są takie same jak w przykładzie Self-Host .

Uwaga

Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.

Kod usługi został zmodyfikowany, tak aby Add metoda w usłudze personifikowała obiekt wywołujący przy użyciu OperationBehaviorAttribute elementu , jak pokazano w poniższym przykładowym kodzie.

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public double Add(double n1, double n2)
{
    double result = n1 + n2;
    Console.WriteLine("Received Add({0},{1})", n1, n2);
    Console.WriteLine("Return: {0}", result);
    DisplayIdentityInformation();
    return result;
}

W związku z tym kontekst zabezpieczeń wykonywanego wątku jest przełączany do personifikacji obiektu wywołującego przed wprowadzeniem Add metody i przywrócony po wyjściu z metody.

Metoda pokazana DisplayIdentityInformation w poniższym przykładowym kodzie jest funkcją narzędzia, która wyświetla tożsamość elementu wywołującego.

static void DisplayIdentityInformation()
{
    Console.WriteLine("\t\tThread Identity            :{0}",
         WindowsIdentity.GetCurrent().Name);
    Console.WriteLine("\t\tThread Identity level  :{0}",
         WindowsIdentity.GetCurrent().ImpersonationLevel);
    Console.WriteLine("\t\thToken                     :{0}",
         WindowsIdentity.GetCurrent().Token.ToString());
    return;
}

Metoda Subtract w usłudze personifikuje obiekt wywołujący przy użyciu wywołań imperatywnych, jak pokazano w poniższym przykładowym kodzie.

public double Subtract(double n1, double n2)
{
    double result = n1 - n2;
    Console.WriteLine("Received Subtract({0},{1})", n1, n2);
    Console.WriteLine("Return: {0}", result);
    Console.WriteLine("Before impersonating");
    DisplayIdentityInformation();

    if (ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel == TokenImpersonationLevel.Impersonation ||
        ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel == TokenImpersonationLevel.Delegation)
    {
        // Impersonate.
        using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
        {
            // Make a system call in the caller's context and ACLs
            // on the system resource are enforced in the caller's context.
            Console.WriteLine("Impersonating the caller imperatively");
            DisplayIdentityInformation();
        }
    }
    else
    {
        Console.WriteLine("ImpersonationLevel is not high enough to perform this operation.");
    }

    Console.WriteLine("After reverting");
    DisplayIdentityInformation();
    return result;
}

Należy pamiętać, że w tym przypadku obiekt wywołujący nie jest personifikowany dla całego wywołania, ale jest personifikowany tylko dla części wywołania. Ogólnie rzecz biorąc, personifikacja najmniejszego zakresu jest preferowana do personifikacji dla całej operacji.

Inne metody nie personifikują elementu wywołującego.

Kod klienta został zmodyfikowany w celu ustawienia poziomu personifikacji na Impersonation. Klient określa poziom personifikacji, który ma być używany przez usługę przy użyciu TokenImpersonationLevel wyliczenia. Wyliczenie obsługuje następujące wartości: None, , AnonymousIdentificationImpersonation i Delegation. Aby sprawdzić dostęp podczas uzyskiwania dostępu do zasobu systemowego na komputerze lokalnym chronionym przy użyciu list ACL systemu Windows, poziom personifikacji musi być ustawiony na Impersonation, jak pokazano w poniższym przykładowym kodzie.

// Create a client with given client endpoint configuration
CalculatorClient client = new CalculatorClient();

client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;

Po uruchomieniu przykładu żądania operacji i odpowiedzi są wyświetlane w oknach konsoli usługi i klienta. Naciśnij klawisz ENTER w każdym oknie konsoli, aby zamknąć usługę i klienta.

Uwaga

Usługa musi być uruchomiona na koncie administracyjnym lub konto, w ramach których działa, musi mieć przyznane prawa do rejestrowania identyfikatora http://localhost:8000/ServiceModelSamples URI w warstwie HTTP. Takie prawa można przyznać, konfigurując rezerwację przestrzeni nazw przy użyciu narzędzia Httpcfg.exe.

Uwaga

Na komputerach z systemem Windows Server 2003 personifikacja jest obsługiwana tylko wtedy, gdy aplikacja Host.exe ma uprawnienie Personifikacja. (Domyślnie tylko administratorzy mają to uprawnienie). Aby dodać to uprawnienie do konta, w którym działa usługa, przejdź do pozycji narzędzia Administracja istracyjne, otwórz zasady zabezpieczeń lokalnych, otwórz pozycję Zasady lokalne, kliknij pozycję Przypisanie praw użytkownika, a następnie wybierz pozycję Personifikuj klienta po uwierzytelnieniu i kliknij dwukrotnie pozycję Właściwości, aby dodać użytkownika lub grupę.

Aby skonfigurować, skompilować i uruchomić przykład

  1. Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.

  2. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

  3. Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.

  4. Aby zademonstrować, że usługa personifikuje obiekt wywołujący, uruchom klienta na innym koncie niż ta, w której działa usługa. W tym celu w wierszu polecenia wpisz:

    runas /user:<machine-name>\<user-name> client.exe
    

    Następnie zostanie wyświetlony monit o podanie hasła. Wprowadź hasło dla wcześniej określonego konta.

  5. Po uruchomieniu klienta zanotuj tożsamość przed uruchomieniem i po jej uruchomieniu przy użyciu różnych poświadczeń.