Практическое руководство. Ограничение доступа с использованием класса 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
    

См. также