Partilhar via


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

  1. Abra o console de Gerenciamento do Computador.

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

  3. Clique com o botão direito do rato 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, você deve fazer logoff do computador e logon novamente para ser incluído no grupo.

Para exigir a associação de usuário

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

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

  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 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
    
  4. 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 a NamePrincipalPermissionAttribute 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. Com UseAspNetRoles definido como o PrincipalPermissionMode no serviço, esse valor de identidade primária é comparado com o Name 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
    

Consulte também