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 Arbeitsbeispiel finden Sie unter Zugriffsautorisierung für 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
Öffnen Sie die Konsole Computerverwaltung.
Klicken Sie links im Fenster auf Lokale Benutzer und Gruppen.
Klicken Sie mit der rechten Maustaste auf Gruppen, und klicken Sie auf Neue Gruppe.
Geben Sie im Feld Gruppenname einen Namen für die neue Gruppe ein.
Geben Sie im Feld Beschreibung eine Beschreibung für die neue Gruppe ein.
Klicken Sie auf Hinzufügen, um neue Mitglieder zur Gruppe hinzuzufügen.
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
Öffnen Sie die Windows Communication Foundation (WCF)-Codedatei mit dem Code des implementierten Dienstvertrags. Weitere Informationen über zum Implementieren eines Vertrags finden Sie unter Implementieren von Dienstverträgen.
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. Beispiel:
' 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; }
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 Anzeigen der Eigenschaften eines Zertifikats finden Sie unter Vorgehensweise: Anzeigen von Zertifikaten mit dem MMC-Snap-In. Informationen zum Abrufen des Werts für den Fingerabdruck finden Sie unter Vorgehensweise: Abrufen des Fingerabdrucks eines Zertifikats.
So steuern Sie den Zugriff mithilfe eines Zertifikats
Wenden Sie die PrincipalPermissionAttribute-Klasse auf die Methode an, für die der Zugriff eingeschränkt werden soll.
Setzen Sie die Aktion des Attributs auf System.Security.Permissions.SecurityAction.Demand.
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 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; }
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 DienstUseAspNetRoles
alsPrincipalPermissionMode
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:
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;
Siehe auch
Aufgaben
Zugriffsautorisierung für Dienstvorgänge
Verweis
PrincipalPermissionAttribute
PrincipalPermissionAttribute
Demand
Role