Comment : restreindre l'accès à l'aide de la classe PrincipalPermissionAttribute
Le contrôle de l'accès aux ressources sur un ordinateur de domaine Windows est une tâche de sécurité de base. Par exemple, certains utilisateurs doivent pouvoir consulter des données sensibles, telles que les informations relatives aux salaires. Cette rubrique explique comment restreindre l'accès à une méthode en exigeant que l'utilisateur appartienne à un groupe prédéfini. Pour obtenir un exemple fonctionnel, consultez Authorizing Access to Service Operations.
La tâche se compose de deux procédures séparées. La première crée le groupe et le remplit avec les utilisateurs. La deuxième applique la classe PrincipalPermissionAttribute pour spécifier le groupe.
Pour créer un groupe Windows
Ouvrez la console Gestion de l'ordinateur.
Dans le panneau gauche, cliquez sur Utilisateurs et groupes locaux.
Cliquez avec le bouton droit sur Groupes, puis sur Nouveau groupe.
Dans la zone Nom du groupe, tapez un nom pour le nouveau groupe.
Dans la zone Description, tapez une description du nouveau groupe.
Pour ajouter de nouveaux membres au groupe, cliquez sur Ajouter.
Si vous vous êtes vous-même ajouté au groupe et souhaitez tester le code suivant, vous devez vous déconnecter, puis vous reconnecter à l'ordinateur pour être inclus dans le groupe.
Pour demander l'appartenance des utilisateurs
Ouvrez le fichier de code Windows Communication Foundation (WCF) qui contient le code de contrat de service implémenté. Pour plus d'informations sur le sujet suivant l'implémentation d'un contrat, consultez Implémentation de contrats de service.
Appliquez l'attribut PrincipalPermissionAttribute à chaque méthode qui doit être restreinte à un groupe spécifique. Affectez Demand à la propriété Action et le nom du groupe à la propriété Role. Par exemple :
' 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; }
Remarque : Si vous appliquez l'attribut PrincipalPermissionAttribute à un contrat, une exception SecurityException sera levée. Vous pouvez appliquer l'attribut uniquement au niveau de la méthode.
Utilisation d'un certificat pour contrôler l'accès à une méthode
Vous pouvez également utiliser la classe PrincipalPermissionAttribute pour contrôler l'accès à une méthode si le type d'informations d'identification du client est un certificat. Pour ce faire, vous devez avoir l'empreinte numérique et le sujet du certificat.
Pour examiner les propriétés d'un certificat, consultez Comment : afficher des certificats à l'aide du composant logiciel enfichable MMC. Pour rechercher la valeur d'empreinte numérique, consultez Comment : récupérer l'empreinte numérique d'un certificat.
Pour contrôler l'accès à l'aide d'un certificat
Appliquez la classe PrincipalPermissionAttribute à la méthode à laquelle vous souhaitez restreindre l'accès.
Affectez System.Security.Permissions.SecurityAction.Demand à l'action de l'attribut.
Affectez à la propriété Name une chaîne qui se compose du nom du sujet et de l'empreinte numérique du certificat. Séparez les deux valeurs par un point-virgule et un espace, tel qu'indiqué dans l'exemple suivant :
' 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; }
Affectez UseAspNetRoles à la propriété PrincipalPermissionMode, tel qu'indiqué dans l'exemple de configuration suivant :
<behaviors> <serviceBehaviors> <behavior name="SvcBehavior1"> <serviceAuthorization principalPermissionMode="UseAspNetRoles" /> </behavior> </serviceBehaviors> </behaviors>
L'affectation de
UseAspNetRoles
à cette valeur indique que la propriété Name de PrincipalPermissionAttribute sera utilisée pour effectuer une comparaison de chaînes. Lorsqu'un certificat est utilisé en tant qu'information d'identification du client, WCF concatène par défaut l'empreinte numérique et le nom commun du certificat à un point-virgule pour créer une valeur unique pour l'identité principale du client. AvecUseAspNetRoles
défini en tant quePrincipalPermissionMode
sur le service, la valeur de cette identité principale est comparée à celle de la propriété Name afin de déterminer les droits d'accès de l'utilisateur.Vous pouvez également, lorsque vous créez un service auto-hébergé, définir la propriété PrincipalPermissionMode dans le code, tel qu'indiqué dans le code suivant :
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;
Voir aussi
Tâches
Authorizing Access to Service Operations
Référence
PrincipalPermissionAttribute
PrincipalPermissionAttribute
Demand
Role
Concepts
Vue d'ensemble de la sécurité
Implémentation de contrats de service