Олицетворение клиента
В примере олицетворения показано, как олицетворение вызывающего приложения в службе, чтобы служба может получить доступ к системным ресурсам от имени вызывающего объекта.
Этот пример основан на примере локального узла . Файлы конфигурации службы и клиента совпадают с файлами конфигурации самообслуживания .
Примечание.
Процедура настройки и инструкции по построению для данного образца приведены в конце этого раздела.
Код службы был изменен таким образом, чтобы метод 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, откройте локальную политику безопасности, откройте локальную политику безопасности, выберите "Назначение прав пользователей" и выберите "Олицетворение клиента" после проверки подлинности и дважды щелкните "Свойства", чтобы добавить пользователя или группу.
Настройка, сборка и выполнение образца
Убедитесь, что вы выполнили процедуру однократной установки для примеров Windows Communication Foundation.
Чтобы создать выпуск решения на языке C# или Visual Basic .NET, следуйте инструкциям в разделе Building the Windows Communication Foundation Samples.
Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".
Для демонстрации олицетворения абонента службой, запустите клиент под другой учетной записью, отличной от той, под которой работает служба. Чтобы сделать это, введите в командной строке следующую команду.
runas /user:<machine-name>\<user-name> client.exe
После этого будет запрошен ввод пароля. Введите пароль для ранее указанной учетной записи.
При запуске клиента обратите внимание, что идентификация до и после его запуска будет иметь разные учетные данные.