Como: Restringir o acesso com a classe PrincipalPermissionAttribute
Controlar o acesso a recursos em um computador de domínio do Windows é uma tarefa básica de segurança. Por exemplo, apenas alguns usuários devem ser capazes de visualizar dados confidenciais, como informações de folha de pagamento. Este tópico explica como restringir o acesso a um método exigindo que o usuário pertença a um grupo predefinido. Para obter um exemplo de trabalho, consulte Autorizando o acesso a operações de serviço.
A tarefa consiste em dois procedimentos separados. O primeiro cria o grupo e o preenche com usuários. O segundo aplica a PrincipalPermissionAttribute classe para especificar o grupo.
Para criar um grupo do Windows
Abra o console de Gerenciamento do Computador.
No painel esquerdo, clique em Usuários e Grupos Locais.
Clique com o botão direito do rato em Grupos e clique em Novo Grupo.
Na caixa Nome do Grupo, digite um nome para o novo grupo.
Na caixa Descrição, digite uma descrição do novo grupo.
Clique no botão Adicionar para adicionar novos membros ao grupo.
Se você se adicionou ao grupo e deseja testar o código a seguir, você deve fazer logoff do computador e logon novamente para ser incluído no grupo.
Para exigir a associação de usuário
Abra o arquivo de código do Windows Communication Foundation (WCF) que contém o código do contrato de serviço implementado. Para obter mais informações sobre como implementar um contrato, consulte Implementando contratos de serviço.
Aplique o PrincipalPermissionAttribute atributo a cada método que deve ser restrito a um grupo específico. Defina a Action propriedade como Demand e a Role propriedade para o nome do grupo. Por exemplo:
// 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
Nota
Se você aplicar o PrincipalPermissionAttribute atributo a um contrato, um SecurityException será lançado. Você só pode aplicar o atributo no nível do método.
Usando um certificado para controlar o acesso a um método
Você também pode usar a classe para controlar o PrincipalPermissionAttribute
acesso a um método se o tipo de credencial do cliente for um certificado. Para fazer isso, você deve ter o assunto do certificado e impressão digital.
Para examinar um certificado quanto às suas propriedades, consulte Como exibir certificados com o snap-in do MMC. Para localizar o valor da impressão digital, consulte Como recuperar a impressão digital de um certificado.
Para controlar o acesso usando um certificado
Aplique a PrincipalPermissionAttribute classe ao método ao qual você deseja restringir o acesso.
Defina a ação do atributo como SecurityAction.Demand.
Defina a
Name
propriedade como uma cadeia de caracteres que consiste no nome do assunto e na impressão digital do certificado. Separe os dois valores com um ponto-e-vírgula e um espaço, conforme mostrado no exemplo a seguir:// 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
Defina a PrincipalPermissionMode propriedade como UseAspNetRoles mostrado no exemplo de configuração a seguir:
<behaviors> <serviceBehaviors> <behavior name="SvcBehavior1"> <serviceAuthorization principalPermissionMode="UseAspNetRoles" /> </behavior> </serviceBehaviors> </behaviors>
Definir esse valor como
UseAspNetRoles
indica que aName
PrincipalPermissionAttribute
propriedade do será usada para executar uma comparação de cadeia de caracteres. Quando um certificado é usado como uma credencial de cliente, por padrão, o WCF concatena o nome comum do certificado e a impressão digital com um ponto-e-vírgula para criar um valor exclusivo para a identidade principal do cliente. ComUseAspNetRoles
definido como oPrincipalPermissionMode
no serviço, esse valor de identidade primária é comparado com oName
valor da propriedade para determinar os direitos de acesso do usuário.Como alternativa, ao criar um serviço auto-hospedado, defina a PrincipalPermissionMode propriedade no código conforme mostrado no código a seguir:
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