Procédure : restreindre l’accès à 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 de travail, 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

  1. Ouvrez la console Gestion de l’ordinateur.

  2. Dans le panneau gauche, cliquez sur Utilisateurs et groupes locaux.

  3. Cliquez avec le bouton droit sur Groupes, puis sur Nouveau groupe.

  4. Dans la zone Nom du groupe, tapez un nom pour le nouveau groupe.

  5. Dans la zone Description, tapez une description du nouveau groupe.

  6. Pour ajouter de nouveaux membres au groupe, cliquez sur Ajouter.

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

  1. Ouvrez le fichier de code Windows Communication Foundation (WCF) qui contient le code de contrat de service implémenté. Pour plus d’informations sur l’implémentation d’un contrat, consultez Implémentation de contrats de service.

  2. Appliquez l'attribut PrincipalPermissionAttribute à chaque méthode qui doit être restreinte à un groupe spécifique. Affectez Action à la propriété Demand 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 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
    
    

    Notes

    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 Guide pratique pour afficher des certificats à l’aide du composant logiciel enfichable MMC. Pour rechercher la valeur de l’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

  1. Appliquez la classe PrincipalPermissionAttribute à la méthode à laquelle vous souhaitez restreindre l'accès.

  2. Affectez SecurityAction.Demand à l'action de l'attribut.

  3. 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 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. Affectez PrincipalPermissionMode à la propriété UseAspNetRoles, 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. Avec UseAspNetRoles défini en tant que PrincipalPermissionMode 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 :

    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
    

Voir aussi