Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Im Rahmen dieser Aufgabe wird gewährleistet, dass von einem Satz Benutzeranmeldeinformationen Vorgänge auf dem Workflowdienst aufgerufen werden, die in Übung 1: Erstellen eines grundlegenden Workflowdiensts erstellt wurden. Diese Anmeldeinformationen werden in Form eines ClaimSet an den Dienst übermittelt. Weitere Informationen zu ClaimSets finden Sie unter Managing Claims and Authorization with the Identity Model.
Tipp
Wird der Workflow-Designer von Visual Studio zum Erstellen oder Verwalten von Workflowdiensten verwendet, werden dadurch gelegentlich unechte Validierungsfehler verursacht. Falls Sie das Projekt erfolgreich erstellen können, ignorieren Sie die Auswertungsfehler.
Aktivieren der Benutzerprüfung durch ClaimSets
Falls Sie derzeit über keine offene WorkflowServiceTutorial-Lösung verfügen, öffnen Sie Visual Studio 2008, klicken Sie auf Datei, markieren Sie Öffnen, und navigieren Sie zur WorkflowServiceTutorial-Lösung.
Klicken Sie im Bereich Projektmappen-Explorer im Projektknoten WorkflowServiceTutorial mit der rechten Maustaste auf den Unterordner Verweise, und wählen Sie Verweis Hinzufügen aus. Haben Sie alternativ eine Visual Basic-Projektmappe erstellt, klicken Sie mit der rechten Maustaste auf den Projektknoten WorkflowServiceTutorial, und wählen Sie Verweis hinzufügen aus.
Wählen Sie auf der Registerkarte .NET im Dialogfeld Verweis hinzufügen System.IdentityModel aus, und klicken Sie auf OK.
Die Objekte ClaimSet und List werden in dieser Aufgabe verwendet. Fügen Sie also folgende using-Anweisungen oben in Workflow1.cs ein:
using System.IdentityModel.Claims; using System.Collections.Generic;Haben Sie eine Visual Basic-Projektmappe erstellt, klicken Sie mit der rechten Maustaste auf den Projektknoten WorkflowServiceTutorial, und wählen Sie Eigenschaften aus. Wählen Sie die Registerkarte Verweise aus, und klicken Sie unter Importierte Namespaces auf die Kontrollkästchen für System.IdentityModel.Claims. Der Namespace System.Collections.Generic wird bereits unterstützt.
Wird der Workflow-Designer für den Workflowdienst nicht angezeigt, öffnen Sie den Designer, indem Sie mit der rechten Maustaste auf Workflow1.cs klicken (oder Workflow1.vb, falls Sie eine Visual Basic-Projektmappe erstellt haben) und Ansicht-Designer auswählen.
Doppelklicken Sie in der Workflow1InitialState-StateActivity-Aktivität zum Erweitern dieser zusammengesetzten Aktivität auf die WaitToStartService-EventDrivenActivity-Aktivität.
Markieren Sie die dem StartupService-Vorgang zugeordnete ReceiveActivity-Aktivität.
Geben Sie im Bereich Eigenschaften unter OperationValidation ValidateUser ein, und drücken Sie die EINGABETASTE, um automatisch einen Eventhandler für das OperationValidation-Ereignis zu generieren.
Navigieren Sie zum ValidateUser-Ereignishandler.
Prüfen Sie im Text von ValidateUser, ob der Benutzer vorher vom Dienst erkannt wurde. Ist dies nicht der Fall, erlauben Sie keine Vorgangsaufrufe durch diesen Benutzer. Dies ist z. B. hilfreich, wenn ein Verkäufer eine Bestellung startet und diese einige Tage lang nicht abschließt. Sie sollten überprüfen, ob es sich um denselben Benutzer handelt, bevor Sie ihm das Aufrufen weiterer Vorgänge auf dem Dienst erlauben. Konversations- und Kontext-IDs können nicht verwendet werden, da ihre Identität von böswilligen Benutzern angenommen werden kann.
Private Sub ValidateUser(ByVal sender As System.Object, ByVal e As System.Workflow.Activities.OperationValidationEventArgs) For Each claims As ClaimSet In e.ClaimSets ' Find the claim that contains the name of the operation caller. Dim opCaller As List(Of Claim) = claims.FindClaims(ClaimTypes.Name, Rights.PossessProperty).ToList() ' Retrieve the name of the caller from the claim. Dim opCallerName As String = opCaller(0).Resource.ToString() ' If this is the caller's first time through the ValidationUser method, set ' the operation caller's name to a global variable named "owner." Every subsequent ' operation that uses this method will verify that the caller of ' the operation is the same as the caller of the initial operation before ' either validating or invalidating the caller. If [String].IsNullOrEmpty(owner) Then owner = opCallerName ElseIf Not owner.Equals(opCallerName) Then e.IsValid = False End If Next End Subprivate void ValidateUser(object sender, OperationValidationEventArgs e) { foreach (ClaimSet claims in e.ClaimSets) { // Find the claim that contains the name of the operation caller. List<Claim> opCaller = claims.FindClaims(ClaimTypes.Name, Rights.PossessProperty).ToList<Claim>(); // Retrieve the name of the caller from the claim. string opCallerName = opCaller[0].Resource.ToString(); // If this is the caller's first time through the ValidationUser method, set // the operation caller's name to a global variable named "owner." Every subsequent // operation that uses this method will verify that the caller of // the operation is the same as the caller of the initial operation before // either validating or invalidating the caller. if(String.IsNullOrEmpty(owner)) { owner = opCallerName; } else if (!owner.Equals(opCallerName)) { e.IsValid = false; } } }Deklarieren Sie eine Variable mit der Bezeichnung "owner" zur Prüfung, wenn nachfolgende Vorgangsaufrufe wie im folgenden Code empfangen werden:
Public class ServerWorkflow Inherits StateMachineWorkflowActivity ' These variables are bound to the input and output parameters of the ReceiveActivity. Public returnValue As Int32 = Nothing Public inputValue As Int32 = Nothing 'This variable contains the user name for the NT account used in operation validation. Public owner As String = Nothing ... End Classpublic sealed partial class ServerWorkflow : StateMachineWorkflowActivity { public ServerWorkflow() { InitializeComponent(); } // These variables are bound to the input and output parameters of the ReceiveActivity. public int returnValue = default(int); public int inputValue = default(int); // This variable contains the user name for the NT account used // in operation validation. public string owner = default(string); ... }Ordnen Sie für jeden der verbleibenden Vorgänge das OperationValidation-Ereignis der ValidateUser-Methode zu.
Erstellen Sie die Projektmappe, und überprüfen Sie, ob die Autorisierungsprüfung funktioniert.
Falls ein Benutzer mit einem anderen Benutzernamen versucht, nach dem Festlegen der owner-Variable einen Vorgang auf dem Dienst aufzurufen, wird dem Client folgende Fehlermeldung zurückgegeben:
Security check failed.Tipp
Ein ClaimSet wird vor PrincipalPermissionRole oder PrincipalPermissionName verarbeitet. Falls Sie also zwei verschiedene Autorisierungsprüfungen für eine NT-Kontogruppe ausführen, von denen bei der einen ClaimSet und bei der anderen PrincipalPermissionRole verwendet wird, wird die ClaimSet-Autorisierungsprüfung zuerst ausgeführt.
Siehe auch
Aufgaben
Aufgabe 1: Aktivieren der rollenbasierten Autorisierung auf dem Workflowdienst
Weitere Ressourcen
Übung 2: Implementieren von Sicherheitsfeatures im Workflowdienst
Copyright © 2007 Microsoft Corporation. Alle Rechte vorbehalten.