Procedura: limitare l'accesso tramite la classe PrincipalPermissionAttribute

Il controllo dell'accesso alle risorse di un computer appartenente a un dominio Windows è un'attività di sicurezza di base. Ad esempio, solo determinati utenti devono essere in grado di visualizzare i dati riservati, ad esempio le informazioni sulle retribuzioni dei dipendenti. In questo argomento viene descritto come consentire l'accesso a un metodo specifico esclusivamente agli utenti che appartengono a un determinato gruppo. Per un esempio del funzionamento, vedere Autorizzazione dell'accesso alle operazioni del servizio.

Questa attività è costituita da due procedure distinte. La prima crea il gruppo e lo popola di utenti, mentre la seconda applica la classe PrincipalPermissionAttribute per definire il gruppo.

Per creare un gruppo di Windows

  1. Aprire la console Gestione computer.

  2. Nel pannello a sinistra, fare clic su Utenti e gruppi locali.

  3. Fare clic con il pulsante destro del mouse su Gruppi, quindi scegliere Nuovo gruppo.

  4. Nella casella Nome gruppo, digitare il nome del nuovo gruppo.

  5. Nella casella Descrizione, digitare la descrizione del nuovo gruppo.

  6. Fare clic sul pulsante Aggiungi per aggiungere nuovi membri al gruppo.

  7. Gli utenti che si aggiungono al gruppo e desiderano testare il codice seguente devono disconnettersi dal computer e quindi connettersi nuovamente per essere inclusi effettivamente nel gruppo.

Per richiedere l'appartenenza dell'utente

  1. Aprire il file di codice Windows Communication Foundation (WCF) che contiene il codice del contratto di servizio implementato. Per altre informazioni sull'implementazione di un contratto, vedere Implementazione di contratti di servizio.

  2. Applicare l'attributo PrincipalPermissionAttribute a ogni metodo per cui si desidera che l'accesso sia consentito esclusivamente a un gruppo specifico. Impostare la proprietà Action su Demand e la proprietà Role sul nome del gruppo. Ad esempio:

    // 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 si applica l'attributo PrincipalPermissionAttribute ad un contratto, verrà generata la classe SecurityException. È possibile applicare l'attributo soltanto a livello di metodo.

Utilizzo di un certificato per controllare l'accesso a un metodo

Se il tipo di credenziale client è un certificato, l'accesso a un metodo può anche essere controllato mediante la classe PrincipalPermissionAttribute. A tale scopo è necessario disporre del soggetto e dell'identificazione personale del certificato.

Per esaminare un certificato per verificare le relative proprietà, vedere Procedura: Visualizzare i certificati con lo snap-in MMC. Per trovare il valore di identificazione personale, vedere Procedura: Recuperare l'identificazione personale di un certificato.

Per controllare l'accesso tramite un certificato

  1. Applicare la classe PrincipalPermissionAttribute al metodo per cui si desidera limitare l'accesso.

  2. Impostare l'azione dell'attributo su SecurityAction.Demand.

  3. Impostare la proprietà Name su una stringa costituita dal nome del soggetto e dall'identificazione personale del certificato. Separare i due valori con un punto e virgola e un spazio, come mostrato nell'esempio seguente:

    // 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. Impostare la proprietà PrincipalPermissionMode su UseAspNetRoles come illustrato nell'esempio di configurazione seguente:

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

    L'impostazione di questo valore su UseAspNetRoles indica che la proprietà Name dell'elemento PrincipalPermissionAttribute viene utilizzata per eseguire un confronto tra stringhe. Per impostazione predefinita, quando un certificato viene utilizzato come credenziale client, WCF concatena il nome comune e l'identificazione personale del certificato con un punto e virgola allo scopo di creare un valore univoco da utilizzare come identità primaria del client. Se nel servizio la modalità UseAspNetRoles è stata impostata su PrincipalPermissionMode, questo valore di identità primaria viene confrontato con il valore della proprietà Name per determinare i diritti di accesso dell'utente.

    In alternativa, quando si crea un servizio indipendente, impostare la proprietà PrincipalPermissionMode in codice, come mostrato nel codice seguente:

    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
    

Vedi anche