Практическое руководство. Ограничение доступа с помощью класса PrincipalPermissionAttribute

Управление доступом к ресурсам на компьютере с доменом Windows является основной задачей безопасности. Например, только некоторые пользователи должны иметь возможность просматривать конфиденциальные данные, такие как сведения о заработной плате. В этом разделе объясняется, как ограничить доступ к методу, требуя, чтобы пользователь принадлежал к предопределенной группе. Рабочий пример см. в разделе "Авторизация доступа к операциям службы".

Задача состоит из двух отдельных процедур. Первый создает группу и заполняет ее пользователями. Второй применяет PrincipalPermissionAttribute класс для указания группы.

Создание группы Windows

  1. Откройте консоль управления компьютером .

  2. На левой панели щелкните "Локальные пользователи и группы".

  3. Щелкните правой кнопкой мыши группы и выберите команду "Создать группу".

  4. В поле "Имя группы" введите имя новой группы.

  5. В поле "Описание " введите описание новой группы.

  6. Нажмите кнопку "Добавить ", чтобы добавить новых участников в группу.

  7. Если вы добавили себя в группу и хотите протестировать следующий код, необходимо выйти из учетной записи и войти обратно в учетную запись, чтобы вас включили в группу.

Требование членства пользователей

  1. Откройте файл кода Windows Communication Foundation (WCF), содержащий реализованный код контракта службы. Дополнительные сведения о реализации контракта см. в разделе "Реализация контрактов службы".

  2. Примените атрибут к каждому методу PrincipalPermissionAttribute , который должен быть ограничен определенной группой. Установите свойство Action на Demand и свойство Role на имя группы. Рассмотрим пример.

    // Only members of the CalculatorClients group can call this method.
    [PrincipalPermission(SecurityAction.Demand, Role = "CalculatorClients")]
    public double Add(double a, double b)
    {
        return a + b;
    }
    
    ' Only members of the CalculatorClients group can call this method.
    <PrincipalPermission(SecurityAction.Demand, Role:="CalculatorClients")> _
    Public Function Add(ByVal a As Double, ByVal b As Double) As Double
        Return a + b
    End Function
    
    

    Замечание

    При применении атрибута PrincipalPermissionAttribute к контракту будет выбрасываться SecurityException исключение. Атрибут можно применить только на уровне метода.

Использование сертификата для управления доступом к методу

Класс PrincipalPermissionAttribute также можно использовать для управления доступом к методу, если тип этих учетных данных является сертификатом. Для этого необходимо иметь владельца сертификата и его отпечаток.

Чтобы проверить сертификат на наличие свойств, см. Как просматривать сертификаты с помощью оснастки MMC. Чтобы найти значение отпечатка, см. статью "Практическое руководство. Извлечение отпечатка сертификата".

Управление доступом с помощью сертификата

  1. Примените класс к методу PrincipalPermissionAttribute , к которому требуется ограничить доступ.

  2. Установите действие атрибута на SecurityAction.Demand.

  3. Name Задайте для свойства строку, состоящую из имени субъекта и отпечатка сертификата. Разделите два значения с запятой и пробелом, как показано в следующем примере:

    // Only a client authenticated with a valid certificate that has the
    // specified subject name and thumbprint can call this method.
    [PrincipalPermission(SecurityAction.Demand,
        Name = "CN=ReplaceWithSubjectName; 123456712345677E8E230FDE624F841B1CE9D41E")]
    public double Multiply(double a, double b)
    {
        return a * b;
    }
    
    ' Only a client authenticated with a valid certificate that has the 
    ' specified subject name and thumbprint can call this method.
    <PrincipalPermission(SecurityAction.Demand, Name:="CN=ReplaceWithSubjectName; 123456712345677E8E230FDE624F841B1CE9D41E")> _
    Public Function Multiply(ByVal a As Double, ByVal b As Double) As Double
        Return a * b
    End Function
    
  4. PrincipalPermissionMode Задайте для свойства значениеUseAspNetRoles, как показано в следующем примере конфигурации:

    <behaviors>
      <serviceBehaviors>
      <behavior name="SvcBehavior1">
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" />
      </behavior>
      </serviceBehaviors>
    </behaviors>
    

    Установка этого значения UseAspNetRoles указывает, что свойство Name объекта PrincipalPermissionAttribute будет использоваться для сравнения строк. Если сертификат используется в качестве учетных данных клиента, по умолчанию WCF объединяет общее имя сертификата и отпечаток с запятой, чтобы создать уникальное значение для первичного удостоверения клиента. Если UseAspNetRoles установлено как PrincipalPermissionMode в службе, это основное значение удостоверения сравнивается со значением свойства Name, чтобы определить права доступа пользователя.

    Кроме того, при создании локальной службы задайте PrincipalPermissionMode свойство в коде, как показано в следующем коде:

    ServiceHost myServiceHost = new ServiceHost(typeof(Calculator), baseUri);
    ServiceAuthorizationBehavior myServiceBehavior =
        myServiceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
    myServiceBehavior.PrincipalPermissionMode =
        PrincipalPermissionMode.UseAspNetRoles;
    
    Dim myServiceBehavior As ServiceAuthorizationBehavior
    myServiceBehavior = _
       myServiceHost.Description.Behaviors.Find(Of ServiceAuthorizationBehavior)()
    myServiceBehavior.PrincipalPermissionMode = _
       PrincipalPermissionMode.UseAspNetRoles
    

См. также