Олицетворение клиента от веб-службы? - PullRequest
0 голосов
/ 15 февраля 2011

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

1 Ответ

2 голосов
/ 15 февраля 2011

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

Самый простой способ реализовать олицетворение - декларативно использовать методы службы. Атрибут OperationBehavior включает в себя свойство с именем Impersonation. Это свойство может быть установлено как Обязательное или Разрешенное.

 [OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public bool Update()
{
return true;
}

Если для свойства «Олицетворение» установлено значение «Разрешено», учетные данные клиента могут передаваться в службу. Если для Олицетворение установлено значение Обязательный, служба должна принимать учетные данные клиента.

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

Для начала вы должны получить идентификатор Windows, связанный с текущим запросом. Это доступно через объект ServiceSecurityContext.Current. Если свойство WindowsIdentity не равно нулю (помня, что для олицетворения требуется удостоверение Windows), вы можете вызвать метод Impersonate для этого удостоверения. Следующий код демонстрирует эту технику:

 WindowsIdentity callerIdentity =
    ServiceSecurityContext.Current.WindowsIdentity;
    if (callerIdentity == null)
    throw new InvalidOperationException(
    "The caller cannot be mapped to a WindowsIdentity");
    using (WindowsImpersonationContext context = callerIdentity.Impersonate())
    {
        // Access a file as the caller.
    }

Две техники олицетворения, продемонстрированные к настоящему моменту, работают по методике. Также возможно включить олицетворение для всех методов в сервисе. Это можно сделать, установив для свойства ImpersonateCallerForAllOperations в поведении ServiceAuthorization значение true. Вы можете сделать это, как показано в следующем примере кода:

ServiceHost serviceHost = new ServiceHost(typeof(TestService));
ServiceAuthorizationBehavior behavior =
serviceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
behavior.ImpersonateCallerForAllOperations = true;
...