Vorgehensweise: Einschränken des Zugriffs mit der PrincipalPermissionAttribute-Klasse

Den Zugriff auf Ressourcen auf einem Windows-Domänencomputer zu kontrollieren gehört zu den grundlegenden Sicherheitsaufgaben. So sollten zum Beispiel nur bestimmte Benutzer vertrauliche Daten wie Lohnlisten anzeigen können. 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. Ein funktionierendes Beispiel finden Sie unter Autorisieren des Zugriffs auf Dienstvorgänge.

Diese Aufgabe umfasst zwei separate Schritte. Zuerst wird die Gruppe erstellt und mit Benutzern gefüllt. Anschließend wird in einem zweiten Schritt die PrincipalPermissionAttribute-Klasse angewendet, um die Gruppe anzugeben.

So erstellen Sie eine Windows-Gruppe

  1. Öffnen Sie die Konsole Computerverwaltung.

  2. Klicken Sie links im Fenster auf Lokale Benutzer und Gruppen.

  3. Klicken Sie mit der rechten Maustaste auf Gruppen, und klicken Sie auf Neue Gruppe.

  4. Geben Sie im Feld Gruppenname einen Namen für die neue Gruppe ein.

  5. Geben Sie im Feld Beschreibung eine Beschreibung für die neue Gruppe ein.

  6. Klicken Sie auf Hinzufügen, um neue Mitglieder zur Gruppe hinzuzufügen.

  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.

So fordern Sie die Benutzermitgliedschaft an

  1. Öffnen Sie die Windows Communication Foundation (WCF)-Codedatei, die den implementierten Dienstvertragscode enthält. Weitere Informationen zur Implementierung eines Vertrags finden Sie unter Implementierung von Dienstverträgen.

  2. Wenden Sie das PrincipalPermissionAttribute-Attribut auf jede Methode an, die nur für eine bestimmte Gruppe zugelassen werden soll. Legen Sie für die Action-Eigenschaft den Wert Demand fest, und setzen Sie die Role-Eigenschaft auf den Namen der Gruppe. Zum Beispiel:

    // 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. Das Attribut kann nur auf Methodenebene angewendet werden.

Steuern des Zugriffs auf eine Methode mithilfe eines Zertifikats

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. Hierfür müssen Sie den Antragsteller und den Fingerabdruck des Zertifikats kennen.

Informationen zum Untersuchen eines Zertifikats auf seine Eigenschaften finden Sie unter Vorgehensweise: Anzeigen von Zertifikaten mit dem MMC-Snap-In. Informationen zum Ermitteln des Fingerabdruckwerts finden Sie unter Vorgehensweise: Abrufen des Fingerabdrucks eines Zertifikats.

So steuern Sie den Zugriff mithilfe eines Zertifikats

  1. Wenden Sie die PrincipalPermissionAttribute-Klasse auf die Methode an, für die der Zugriff eingeschränkt werden soll.

  2. Setzen Sie die Aktion des Attributs auf SecurityAction.Demand.

  3. Verwenden Sie für die Name-Eigenschaft eine Zeichenfolge mit dem Antragstellernamen und dem Fingerabdruck des Zertifikats. Trennen Sie die beiden Werte durch ein Semikolon und ein Leerzeichen, wie im folgenden Beispiel gezeigt:

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

    <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. Wenn für die Clientanmeldeinformationen ein Zertifikat verwendet wird, verbindet WCF den allgemeinen Namen und den Fingerabdruck des Zertifikats mit einem Semikolon, um so einen eindeutigen Wert für die primäre Identität des Clients zu erzeugen. 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.

    Sie können alternativ wie im folgenden Beispiel auch die PrincipalPermissionMode-Eigenschaft im Code festlegen, wenn Sie einen selbst gehosteten Dienst erstellen:

    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 auch