Поделиться через


Олицетворение клиента

В примере олицетворения показано, как олицетворение вызывающего приложения в службе, чтобы служба может получить доступ к системным ресурсам от имени вызывающего объекта.

Этот пример основан на примере локального узла . Файлы конфигурации службы и клиента совпадают с файлами конфигурации самообслуживания .

Примечание.

Процедура настройки и инструкции по построению для данного образца приведены в конце этого раздела.

Код службы был изменен таким образом, чтобы метод Add службы олицетворял абонента с помощью атрибута OperationBehaviorAttribute, как показано в следующем примере кода.

[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;
}

В результате контекст безопасности выполняющегося потока переключается на олицетворение абонента перед вводом метода Add и возврата к выходу из метода.

Метод DisplayIdentityInformation, показанный в следующем примере кода, является служебной функцией, отображающей идентификацию абонента.

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;
}

Метод Subtract службы олицетворяет абонента с помощью принудительных вызовов, как показано в следующем примере кода.

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;
}

Обратите внимание, что в данном случае абонент не олицетворяется для всего звонка, а только для его части. В общем, олицетворение небольшой части операции предпочтительнее, чем олицетворение всей операции.

Другие методы не олицетворяют абонента.

Клиентский код изменен, чтобы уровень олицетворения был установлен в значение Impersonation. Клиент задает уровень олицетворения, который будет использоваться службой с помощью перечисления TokenImpersonationLevel. Перечисление поддерживает следующие значения: None, Anonymous, Identification, Impersonation и Delegation. Чтобы выполнить проверку доступа при получении доступа к ресурсу системы на локальном компьютере, защищенном с помощью Windows ACL, уровень олицетворения должен быть установлен в значение Impersonation, как показано в следующем примере кода.

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

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

При запуске данного примера запросы и ответы операций отображаются в окнах консоли как службы, так и клиента. Нажмите клавишу ВВОД в каждом окне консоли, чтобы закрыть службу и клиент.

Примечание.

Служба должна выполняться под учетной записью администратора или учетной записью, в которой она выполняется, должна быть предоставлена права на регистрацию http://localhost:8000/ServiceModelSamples URI на уровне HTTP. Такие права можно предоставить, настроив резервирование пространства имен с помощью средства Httpcfg.exe.

Примечание.

На компьютерах под управлением Windows Server 2003 олицетворение поддерживается только в том случае, если у приложения Host.exe есть права олицетворения. (По умолчанию только администраторы имеют это разрешение.) Чтобы добавить эту привилегию в учетную запись, как работает служба, перейдите к Администратор istrative Tools, откройте локальную политику безопасности, откройте локальную политику безопасности, выберите "Назначение прав пользователей" и выберите "Олицетворение клиента" после проверки подлинности и дважды щелкните "Свойства", чтобы добавить пользователя или группу.

Настройка, сборка и выполнение образца

  1. Убедитесь, что вы выполнили процедуру однократной установки для примеров Windows Communication Foundation.

  2. Чтобы создать выпуск решения на языке C# или Visual Basic .NET, следуйте инструкциям в разделе Building the Windows Communication Foundation Samples.

  3. Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".

  4. Для демонстрации олицетворения абонента службой, запустите клиент под другой учетной записью, отличной от той, под которой работает служба. Чтобы сделать это, введите в командной строке следующую команду.

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

    После этого будет запрошен ввод пароля. Введите пароль для ранее указанной учетной записи.

  5. При запуске клиента обратите внимание, что идентификация до и после его запуска будет иметь разные учетные данные.