Compartilhar via


Como restringir o acesso com a classe PrincipalPermissionAttribute

Controlar o acesso a recursos em um computador de domínio windows é uma tarefa básica de segurança. 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 PrincipalPermissionAttribute classe para especificar o grupo.

Para criar um grupo do Windows

  1. Abra o console de Gerenciamento de Computador .

  2. No painel esquerdo, clique em Usuários e Grupos Locais.

  3. Clique com o botão direito do mouse em Grupos e 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ê se adicionou ao grupo e deseja testar o código a seguir, saia do computador e entre 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 como implementar um contrato, consulte Implementando contratos de serviço.

  2. 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 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 PrincipalPermissionAttribute atributo 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 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 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 PrincipalPermissionAttribute classe 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 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
    
  4. Defina a propriedade PrincipalPermissionMode como UseAspNetRoles no exemplo de configuração a seguir.

    <behaviors>
      <serviceBehaviors>
      <behavior name="SvcBehavior1">
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" />
      </behavior>
      </serviceBehaviors>
    </behaviors>
    

    Configurar este valor como UseAspNetRoles indica que a propriedade Name do PrincipalPermissionAttribute será empregada para realizar 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 primária é comparado com o valor da Name 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
    

Consulte também