Procedimiento para restringir el acceso con la clase PrincipalPermissionAttribute

Controlar el acceso a los recursos en un equipo del dominio de Windows es una tarea de seguridad básica. Por ejemplo, solo ciertos usuarios deberían poder ver los datos confidenciales, como la información de la nómina. Este tema explica cómo restringir el acceso a un método exigiendo que el usuario pertenezca a un grupo predefinido. Para obtener un ejemplo de trabajo, consulte Autorización del acceso a operaciones de servicio.

La tarea está compuesta de dos procedimientos independientes. El primero crea el grupo y lo rellena con usuarios. El segundo aplica la clase PrincipalPermissionAttribute para especificar el grupo.

Para crear un grupo de Windows

  1. Abra la consola Administración del equipo.

  2. En el panel izquierdo, haga clic en Usuarios y grupos locales.

  3. Haga clic con el botón derecho en Grupos y haga clic en Nuevo grupo.

  4. En la casilla Nombre de grupo, escriba un nombre para el nuevo grupo.

  5. En la casilla Descripción, escriba una descripción del nuevo grupo.

  6. Para agregar nuevos miembros al grupo, haga clic en el botón Agregar.

  7. Si se ha agregado al grupo y desea probar el código siguiente, debe cerrar la sesión en el equipo y volver a iniciarla para estar incluido en el grupo.

Para exigir la pertenencia del usuario

  1. Abra el archivo de código de Windows Communication Foundation (WCF) que contiene el código de contrato de servicio implementado. Para obtener más información sobre la implementación de un contrato, consulte Implementación de contratos de servicios.

  2. Aplique el atributo PrincipalPermissionAttribute a cada método que debe estar restringido a un grupo concreto. Establezca la propiedad Action en Demand y la propiedad Role en el nombre del grupo. Por ejemplo:

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

    Si se aplica el atributo a un contrato PrincipalPermissionAttribute, se iniciará una SecurityException. El atributo solo puede aplicarse en el nivel del método.

Uso de un certificado para controlar el acceso a un método

También puede utilizar la clase PrincipalPermissionAttribute para controlar el acceso a un método si el tipo de credencial de cliente es un certificado. Para hacerlo, debe tener el asunto y la huella digital del certificado.

Para examinar un certificado para sus propiedades, consulte Cómo: Ver certificados con el complemento MMC. Para buscar el valor de huella digital, consulte Procedimiento para recuperar la huella digital de un certificado.

Para controlar el acceso mediante un certificado

  1. Aplique la clase PrincipalPermissionAttribute al método al que desea restringir el acceso.

  2. Establezca la acción del atributo en SecurityAction.Demand.

  3. Establezca la propiedad Name en una cadena que esté compuesta del nombre del sujeto y la huella digital del certificado. Separe los dos valores con un punto y coma y un espacio, como se muestra en el ejemplo siguiente:

    // 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. Establezca la propiedad PrincipalPermissionMode en UseAspNetRoles como se muestra en el siguiente ejemplo de configuración:

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

    Establecer este valor en UseAspNetRoles indica que la propiedad Name del PrincipalPermissionAttribute se utilizará para realizar una comparación de cadenas. Cuando se utiliza un certificado como una credencial del cliente, WCF concatena de forma predeterminada el nombre común del certificado y la huella digital con un punto y coma para crear un valor único para la identidad primaria del cliente. Con UseAspNetRoles establecido como PrincipalPermissionMode en el servicio, este valor de identidad primaria se compara con el valor de la propiedad Name para determinar los derechos de acceso del usuario.

    Alternativamente, al crear un servicio autohospedado, establezca la propiedad PrincipalPermissionMode en código como se muestra en el código siguiente:

    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 también