Практическое руководство. Ограничение доступа с использованием класса PrincipalPermissionAttribute
Управление доступом к ресурсам компьютера Windows-домена - это базовая задача обеспечения безопасности. Например, только определенные пользователи должны иметь возможность просматривать конфиденциальные данные, такие как платежные ведомости. В этом разделе рассматривается, как ограничить доступ к методу, потребовав, чтобы пользователь принадлежал к заранее заданной группе. Рабочий пример см. в разделе "Авторизация доступа к операциям службы".
Эта задача состоит из двух отдельных процедур. Первая создает группу и заносит в нее пользователей. Вторая применяет класс PrincipalPermissionAttribute, чтобы задать группу.
Создание группы Windows
Откройте консоль управления компьютером.
На левой панели щелкните "Локальные пользователи и группы".
Щелкните правой кнопкой мыши группы и выберите команду "Создать группу".
В поле "Имя группы" введите имя новой группы.
В поле "Описание" введите описание новой группы.
Нажмите кнопку "Добавить", чтобы добавить новых участников в группу.
Если вы добавили себя в группу и хотите протестировать приведенный ниже код, необходимо выйти из системы и снова войти в нее, чтобы быть включенным в группу.
Требование членства пользователя
Откройте файл кода Windows Communication Foundation (WCF), содержащий реализованный код контракта службы. Дополнительные сведения о реализации контракта см. в разделе "Реализация контрактов службы".
Примените атрибут 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". Чтобы найти значение отпечатка, см. статью "Практическое руководство. Извлечение отпечатка сертификата".
Управление доступом с помощью сертификата
Примените класс PrincipalPermissionAttribute к методу, доступ к которому требуется ограничить.
Задайте для действия атрибута значение SecurityAction.Demand.
Задайте для свойства
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
Задайте для свойства 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