Разграничение доступа из кода в WCF - Частично доверенные клиенты

ОГЛАВЛЕНИЕ

Частично доверенные клиенты

Чтобы позволить клиентам на любом уровне частичного доверия использовать любые из компонентов и привязок WCF, необходимо заблокировать требование полного доверия со стороны привязок. Единственный способ сделать это – заставить сам прокси установить полное доверие. Установку полного доверия можно проделать через PermissionSetAttribute, используя флаг Assert («Подтвердить») перечисления SecurityAction и указывая строго типизированную строку "FullTrust" для имени полномочия:

[PermissionSet(SecurityAction.Assert,Name = "FullTrust")]

Хотя имя полномочия указывается с использованием строки, компилятор добавляет определенную степень безопасности, проверяя допустимые значение.

Вдобавок, необходимо предотвратить прямой доступ клиента к любому методу базового класса ClientBase<T> (который все так же требует полного доверия), так что прокси необходимо скрыть часто используемые методы Close («Закрыть») и Dispose («Удалить»). То, что сам класс прокси может получать доступ к методам или свойствам ClientBase<T> (таким, как Channel («Канал») или конструкторы) вполне допустимо, поскольку прокси устанавливает полное доверие.

Проблема заключается в том, что для установки полного доверия самому прокси должно быть дано полное доверие, а клиент, имеющий только частичное доверие, не может предоставить это. Следовательно, класс прокси необходимо вынести в собственную сборку, пометить ее как общедоступную и дать этой сборке полное доверие. Это можно сделать, используя приложение панели управления настройки .NET Framework 2.0 – просто укажите сборку прокси, используя основанные на содержимом доказательства, такие как строгое имя, и дайте сборке полное доверие.

Можно также установить сборку прокси в глобальном кэше сборок (GAC) клиента. Поскольку всем сборкам, исходящим из GAC, дается полное доверие, прокси также будет дано полное доверие. Нужно также не забыть объявить атрибут AllowPartiallyTrustedCallers, это позволит частично доверенным источникам вызовов вызывать сборку.

Наконец, необходимо добавить используемое прокси определение контракта к сборке прокси (а также пометить контракт как общедоступный). Это необходимо, поскольку WCF требует полного доверия всех сборок вверх по цепи вызова, и если контракт исходит от частично доверенной сборки, то требование кончится неудачей. На рис. 1 показаны примеры этих определений контракта и прокси.

Рис. 1 Установка полного доверия с помощью прокси

[assembly: AllowPartiallyTrustedCallers]
 
[ServiceContract]
public interface IMyContract
{
  [OperationContract]
  void MyMethod();
}

 

[PermissionSet(SecurityAction.Assert,Name = "FullTrust")]
public class MyContractClient :
  ClientBase<IMyContract>,IMyContract,IDisposable
{
  public MyContractClient() {}

  public MyContractClient(string endpointName) : base(endpointName) {}

  /* More constructors */ 

  public void MyMethod() {
   Channel.MyMethod();
  }
  public new void Close() {
   base.Close();
  }
  void IDisposable.Dispose() {
   Close();
  }
}