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 funzionante, 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
Aprire la console Gestione computer.
Nel pannello sinistro, fare clic su Utenti e gruppi locali.
Fare clic con il pulsante destro del mouse su Gruppi e quindi scegliere Nuovo gruppo.
Nella casella Nome gruppo, digitare il nome del nuovo gruppo.
Nella casella Descrizione, digitare la descrizione del nuovo gruppo.
Fare clic sul pulsante Aggiungi per aggiungere nuovi membri al gruppo.
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
Aprire il file di codice di Windows Communication Foundation (WCF) contenente il codice del contratto di servizio implementato. Per ulteriori informazioni su sull'implementazione di un contratto, vedere Implementazione dei contratti di servizio.
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 Function Add(ByVal a As Double, ByVal b As Double) As Double Return a + b End Function
// 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; }
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 istruzioni su come ricercare e analizzare le proprietà di un certificato, vedere Procedura: visualizzare certificati con lo snap-in MMC. Per rilevare il valore di identificazione personale, vedere Procedura: recuperare l'identificazione personale di un certificato.
Per controllare l'accesso tramite un certificato
Applicare la classe PrincipalPermissionAttribute al metodo per cui si desidera limitare l'accesso.
Impostare l'azione dell'attributo su System.Security.Permissions.SecurityAction.Demand.
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 Function Multiply(ByVal a As Double, ByVal b As Double) As Double Return a * b End Function
// 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; }
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àPrincipalPermissionMode
è stata impostata suUseAspNetRoles
, 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:
Dim myServiceBehavior As ServiceAuthorizationBehavior myServiceBehavior = _ myServiceHost.Description.Behaviors.Find(Of ServiceAuthorizationBehavior)() myServiceBehavior.PrincipalPermissionMode = _ PrincipalPermissionMode.UseAspNetRoles
ServiceHost myServiceHost = new ServiceHost(typeof(Calculator), baseUri); ServiceAuthorizationBehavior myServiceBehavior = myServiceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>(); myServiceBehavior.PrincipalPermissionMode = PrincipalPermissionMode.UseAspNetRoles;
Vedere anche
Attività
Autorizzazione dell'accesso alle operazioni del servizio
Riferimento
PrincipalPermissionAttribute
PrincipalPermissionAttribute
Demand
Role
Concetti
Cenni preliminari sulla sicurezza
Implementazione dei contratti di servizio