Vorgehensweise: Einschränken des Zugriffs mit der PrincipalPermissionAttribute-KlasseHow to: Restrict Access with the PrincipalPermissionAttribute Class

Den Zugriff auf Ressourcen auf einem Windows-Domänencomputer zu kontrollieren gehört zu den grundlegenden Sicherheitsaufgaben.Controlling the access to resources on a Windows-domain computer is a basic security task. So sollten zum Beispiel nur bestimmte Benutzer vertrauliche Daten wie Lohnlisten anzeigen können.For example, only certain users should be able to view sensitive data, such as payroll information. In diesem Thema wird erklärt, wie Sie den Zugriff auf eine Methode beschränken können, indem Sie es zur Voraussetzung machen, dass die entsprechenden Benutzer einer vordefinierten Gruppe angehören.This topic explains how to restrict access to a method by demanding that the user belong to a predefined group. Ein funktionierendes Beispiel finden Sie unter Zugriff auf Dienstvorgänge autorisieren.For a working sample, see Authorizing Access to Service Operations.

Diese Aufgabe umfasst zwei separate Schritte.The task consists of two separate procedures. Zuerst wird die Gruppe erstellt und mit Benutzern gefüllt.The first creates the group and populates it with users. Anschließend wird in einem zweiten Schritt die PrincipalPermissionAttribute-Klasse angewendet, um die Gruppe anzugeben.The second applies the PrincipalPermissionAttribute class to specify the group.

So erstellen Sie eine Windows-GruppeTo create a Windows group

  1. Öffnen der Computerverwaltung Konsole.Open the Computer Management console.

  2. Klicken Sie im linken Bereich auf lokale Benutzer und Gruppen.In the left panel, click Local Users and Groups.

  3. Mit der rechten Maustaste Gruppen, und klicken Sie auf neue Gruppe.Right-click Groups, and click New Group.

  4. In der Gruppenname geben einen Namen für die neue Gruppe.In the Group Name box, type a name for the new group.

  5. In der Beschreibung Geben Sie eine Beschreibung der neuen Gruppe.In the Description box, type a description of the new group.

  6. Klicken Sie auf die hinzufügen Schaltfläche zum Hinzufügen von neuer Mitgliedern der Gruppe.Click the Add button to add new members to the group.

  7. Falls Sie sich selbst zur Gruppe hinzugefügt haben und den folgenden Code testen möchten, müssen Sie sich vom Computer abmelden und dann wieder anmelden, damit Sie in die Gruppe aufgenommen werden.If you have added yourself to the group and want to test the following code, you must log off the computer and log back on to be included in the group.

So fordern Sie die Benutzermitgliedschaft anTo demand user membership

  1. Öffnen Sie die Windows Communication Foundation (WCF)-Codedatei, die den implementierten dienstvertragscode enthält.Open the Windows Communication Foundation (WCF) code file that contains the implemented service contract code. Weitere Informationen zu einen Vertrag implementieren, finden Sie unter implementieren Dienstverträge.For more information about implementing a contract, see Implementing Service Contracts.

  2. Wenden Sie das PrincipalPermissionAttribute-Attribut auf jede Methode an, die nur für eine bestimmte Gruppe zugelassen werden soll.Apply the PrincipalPermissionAttribute attribute to each method that must be restricted to a specific group. Legen Sie für die Action-Eigenschaft den Wert Demand fest, und setzen Sie die Role-Eigenschaft auf den Namen der Gruppe.Set the Action property to Demand and the Role property to the name of the group. Zum Beispiel:For example:

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

    Hinweis

    Wenn Sie das PrincipalPermissionAttribute-Attribut auf einen Vertrag anwenden, wird eine SecurityException ausgelöst.If you apply the PrincipalPermissionAttribute attribute to a contract a SecurityException will be thrown. Das Attribut kann nur auf Methodenebene angewendet werden.You can only apply the attribute at the method level.

Steuern des Zugriffs auf eine Methode mithilfe eines ZertifikatsUsing a Certificate to Control Access to a Method

Sie können mit der PrincipalPermissionAttribute-Klasse auch dann den Zugriff auf eine Methode steuern, wenn es sich bei den Clientanmeldeinformationen um ein Zertifikat handelt.You can also use the PrincipalPermissionAttribute class to control access to a method if the client credential type is a certificate. Hierfür müssen Sie den Antragsteller und den Fingerabdruck des Zertifikats kennen.To do this, you must have the certificate's subject and thumbprint.

Um ein Zertifikat für die zugehörigen Eigenschaften untersuchen zu können, finden Sie unter Vorgehensweise: Anzeigen von Zertifikaten mit dem MMC-Snap-in.To examine a certificate for its properties, see How to: View Certificates with the MMC Snap-in. Den Fingerabdruckwert finden Sie unter wie: Abrufen des Fingerabdrucks eines Zertifikats.To find the thumbprint value, see How to: Retrieve the Thumbprint of a Certificate.

So steuern Sie den Zugriff mithilfe eines ZertifikatsTo control access using a certificate

  1. Wenden Sie die PrincipalPermissionAttribute-Klasse auf die Methode an, für die der Zugriff eingeschränkt werden soll.Apply the PrincipalPermissionAttribute class to the method you want to restrict access to.

  2. Setzen Sie die Aktion des Attributs auf SecurityAction.Demand.Set the action of the attribute to SecurityAction.Demand.

  3. Verwenden Sie für die Name-Eigenschaft eine Zeichenfolge mit dem Antragstellernamen und dem Fingerabdruck des Zertifikats.Set the Name property to a string that consists of the subject name and the certificate's thumbprint. Trennen Sie die beiden Werte durch ein Semikolon und ein Leerzeichen, wie im folgenden Beispiel gezeigt:Separate the two values with a semicolon and a space, as shown in the following example:

    // 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. Legen Sie für die PrincipalPermissionMode-Eigenschaft den Wert UseAspNetRoles wie im folgenden Konfigurationsbeispiel gezeigt fest:Set the PrincipalPermissionMode property to UseAspNetRoles as shown in the following configuration example:

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

    Durch den Wert UseAspNetRoles wird angegeben, dass mit der Name-Eigenschaft von PrincipalPermissionAttribute ein Zeichenfolgenvergleich durchgeführt wird.Setting this value to UseAspNetRoles indicates that the Name property of the PrincipalPermissionAttribute will be used to perform a string comparison. Wenn ein Zertifikat als Clientanmeldeinformationen verwendet wird, verkettet standardmäßig WCF gemeinsame Zertifikatsname und den Fingerabdruck mit einem Semikolon, um einen eindeutigen Wert für die primäre Identität des Clients zu erstellen.When a certificate is used as a client credential, by default WCF concatenates the certificate common name and the thumbprint with a semicolon to create a unique value for the client's primary identity. Sofern für den Dienst UseAspNetRoles als PrincipalPermissionMode gewählt wurde, wird dieser Wert für die primäre Identität mit dem Wert der Name-Eigenschaft verglichen, um die Zugriffsrechte des Benutzers zu ermitteln.With UseAspNetRoles set as the PrincipalPermissionMode on the service, this primary identity value is compared with the Name property value to determine the access rights of the user.

    Sie können alternativ wie im folgenden Beispiel auch die PrincipalPermissionMode-Eigenschaft im Code festlegen, wenn Sie einen selbst gehosteten Dienst erstellen:Alternatively, when creating a self-hosted service, set the PrincipalPermissionMode property in code as shown in the following code:

    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
    

Siehe auchSee Also

PrincipalPermissionAttribute
PrincipalPermissionAttribute
Demand
Role
Zugriffsautorisierung für DienstvorgängeAuthorizing Access to Service Operations
Übersicht über die SicherheitSecurity Overview
Implementieren von DienstverträgenImplementing Service Contracts