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

  1. Abra o console do Gerenciamento do Computador.

  2. No painel esquerdo, clique em Usuários e grupos locais.

  3. Clique com o botão direito do mouse em Grupos e depois clique em Novo grupo.

  4. Na caixa Nome do grupo, digite um nome para o novo grupo.

  5. Na caixa Descrição, digite uma descrição do novo grupo.

  6. Clique no botão Adicionar para adicionar novos membros ao grupo.

  7. 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

  1. 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.

  2. 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

  1. Aplique a classe PrincipalPermissionAttribute ao método ao qual você deseja restringir o acesso.

  2. Defina a ação do atributo como SecurityAction.Demand.

  3. 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
    
  4. 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 propriedade Name do PrincipalPermissionAttribute 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. Com UseAspNetRoles definido como o PrincipalPermissionMode no serviço, esse valor de identidade principal é comparado com o valor da propriedade Name 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
    

Confira também