Como: restringir o acesso com a classe PrincipalPermissionAttribute
Controlar o acesso a recursos em um computador de domínio Windows é uma tarefa de segurança básica. Por exemplo, apenas determinados usuários devem ser capazes de exibir 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 às operações de serviço.
A tarefa consiste em dois procedimentos separados. O primeiro cria o grupo e o popula com usuários. O segundo aplica a classe PrincipalPermissionAttribute para especificar o grupo.
Para criar um grupo do Windows
Abra o console do Gerenciamento do Computador.
No painel esquerdo, clique em Usuários e grupos locais.
Clique com o botão direito do mouse em Grupos e depois 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ê tiver se adicionado ao grupo e quiser testar o código a seguir, faça logoff do computador e faça logon novamente para ser incluído no grupo.
Para exigir a associação do usuário
Abra o arquivo de código WCF (Windows Communication Foundation) que contém o código do contrato de serviço implementado. Para obter mais informações sobre a implementação de um contrato, consulte Implementar contratos de serviço.
Aplique o atributo PrincipalPermissionAttribute a cada método que deve ser restrito a um grupo específico. Defina a propriedade Action como Demand e a propriedade Role como 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
Observação
Se você aplicar o atributo PrincipalPermissionAttribute a um contrato, um SecurityException será gerado. 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 poderá usar a classe PrincipalPermissionAttribute
para controlar o acesso a um método se o tipo de credencial do cliente for um certificado. Para fazer isso, você deve ter o assunto e a impressão digital do certificado.
Para examinar um certificado para 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 classe PrincipalPermissionAttribute ao método ao qual você deseja restringir o acesso.
Defina a ação do atributo como SecurityAction.Demand.
Defina a propriedade
Name
para uma cadeia de caracteres que consiste no nome da entidade 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 propriedade PrincipalPermissionMode como UseAspNetRoles, conforme mostrado no exemplo de configuração a seguir:
<behaviors> <serviceBehaviors> <behavior name="SvcBehavior1"> <serviceAuthorization principalPermissionMode="UseAspNetRoles" /> </behavior> </serviceBehaviors> </behaviors>
Definir esse valor para
UseAspNetRoles
indica que a propriedadeName
doPrincipalPermissionAttribute
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 primária do cliente. ComUseAspNetRoles
definido como oPrincipalPermissionMode
no serviço, esse valor de identidade principal é comparado com o valor da propriedadeName
para determinar os direitos de acesso do usuário.Como alternativa, ao criar um serviço auto-hospedado, defina a propriedade PrincipalPermissionMode no código, conforme mostrado no seguinte código:
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