Как ограничить доступ с использованием класса 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 Function Add(ByVal a As Double, ByVal b As Double) As Double Return a + b End Function
// 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; }
Примечание
Если применить атрибут PrincipalPermissionAttribute к контракту, возникает исключение SecurityException. Этот атрибут может применяться только на уровне метода.
Использование сертификата для управления доступом к методу
Для управления доступом к методу можно также использовать класс PrincipalPermissionAttribute, если типом учетных данных клиента является сертификат. Для этого необходимо иметь субъект и отпечаток сертификата.
Чтобы проверить свойства сертификата, см. раздел Как просматривать сертификаты с помощью оснастки консоли MMC. Чтобы определить значение отпечатка, см. раздел Как извлечь отпечаток сертификата.
Управление доступом с помощью сертификата
Примените класс PrincipalPermissionAttribute к методу, доступ к которому требуется ограничить.
Задайте для действия атрибута значение System.Security.Permissions.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 Function Multiply(ByVal a As Double, ByVal b As Double) As Double Return a * b End Function
// 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; }
Задайте для свойства PrincipalPermissionMode значение UseAspNetRoles, как показано в следующем примере конфигурации:
<behaviors> <serviceBehaviors> <behavior name="SvcBehavior1"> <serviceAuthorization principalPermissionMode="UseAspNetRoles" /> </behavior> </serviceBehaviors> </behaviors>
Задание для этого параметра значения
UseAspNetRoles
означает, что свойство Name атрибута PrincipalPermissionAttribute будет использоваться для строкового сравнения. При использовании сертификата в качестве учетных данных клиента WCF по умолчанию сцепляет общее имя и отпечаток сертификата с точкой с запятой, создавая уникальное значение для первичной идентификации клиента. Если в службе для режимаPrincipalPermissionMode
задано значениеUseAspNetRoles
, для определения прав доступа пользователя это значение первичной идентификации сравнивается со значением свойства Name.При создании резидентной службы можно также задать свойство PrincipalPermissionMode в коде, как показано в следующем коде:
Dim myServiceBehavior As ServiceAuthorizationBehavior myServiceBehavior = _ myServiceHost.Description.Behaviors.Find(Of ServiceAuthorizationBehavior)() myServiceBehavior.PrincipalPermissionMode = _ PrincipalPermissionMode.UseAspNetRoles
ServiceHost myServiceHost = new ServiceHost(typeof(Calculator), baseUri); ServiceAuthorizationBehavior myServiceBehavior = myServiceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>(); myServiceBehavior.PrincipalPermissionMode = PrincipalPermissionMode.UseAspNetRoles;
См. также
Задачи
Авторизация доступа к операциям службы
Справочник
PrincipalPermissionAttribute
PrincipalPermissionAttribute
Demand
Role