Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Con questa attività si assicura che solo un insieme di credenziali utente possa richiamare operazioni sul servizio del flusso di lavoro creato nell'Esercizio 1: creazione di un servizio del flusso di lavoro di base. Queste credenziali vengono passate al servizio sotto forma di un oggetto ClaimSet. Per ulteriori informazioni su ClaimSet, vedere Managing Claims and Authorization with the Identity Model.
Nota
Quando si utilizza Progettazione flussi di lavoro di Visual Studio per creare o gestire servizi del flusso di lavoro, vengono talvolta prodotti errori di convalida non corretti. Se è possibile compilare correttamente il progetto, ignorare gli errori di convalida.
Attivazione della convalida dell'utente tramite ClaimSet
Qualora la soluzione di WorkflowServiceTutorial non sia ancora aperta, aprire Visual Studio 2008, scegliere File, evidenziare Apri e spostarsi sulla soluzione di WorkflowServiceTutorial.
Nel riquadro Esplora soluzioni, nel nodo del progetto WorkflowServiceTutorial fare clic con il pulsante destro del mouse sulla sottocartella Riferimenti e scegliere Aggiungi riferimento. In alternativa, se è stata creata una soluzione Visual Basic, fare clic con il pulsante destro del mouse sul nodo del progetto WorkflowServiceTutorial e scegliere Aggiungi riferimento.
Nella scheda .NET della finestra di dialogo Aggiungi riferimento, selezionare System.IdentityModel e fare clic su OK.
In questa attività vengono utilizzati gli oggetti ClaimSet e List, pertanto aggiungere le istruzioni using seguenti all'inizio di Workflow1.cs:
using System.IdentityModel.Claims; using System.Collections.Generic;Se è stata creata una soluzione Visual Basic, fare clic con il pulsante destro del mouse sul nodo del progetto WorkflowServiceTutorial e scegliere Proprietà. Selezionare la scheda Riferimenti, quindi in Spazi dei nomi importati fare clic sulle caselle di controllo relative a System.IdentityModel.Claims. Lo spazio dei nomi System.Collections.Generic è già supportato.
Se la progettazione flussi di lavoro per il servizio del flusso di lavoro non è visibile, aprire la finestra di progettazione facendo clic con il pulsante destro del mouse su Workflow1.cs (o Workflow1.vb se è stata creata una soluzione Visual Basic) e selezionare Visualizza Finestra di progettazione.
Nell'attività StateActivity Workflow1InitialState, fare doppio clic sull'attività composta EventDrivenActivity per espanderla.
Evidenziare l'attività ReceiveActivity associata all'operazione StartupService.
Nel riquadro Proprietà, in OperationValidationdigitare ValidateUser e premere Invio per generare automaticamente un gestore eventi per l'evento OperationValidation.
Spostarsi sul gestore eventi ValidateUser.
Nel corpo di ValidateUser verificare che l'utente sia prima stato riconosciuto dal servizio, in caso contrario non consentire il richiamo di operazioni. Ciò è utile, ad esempio, se un dipendente addetto alle vendite inizia un ordine di acquisto e ritorna a completarlo molti giorni dopo. È necessario verificare che si tratti dello stesso utente prima di consentirgli di richiamare una o più operazioni sul servizio. Non è possibile utilizzare la conversazione e l'ID del contesto perché possono essere oggetto di rappresentazione da parte di utenti malintenzionati.
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; } } }Dichiarare una variabile denominata "owner" da utilizzare come convalida quando si ricevono chiamate a operazioni successive, come illustrato nel codice seguente:
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); ... }Per ognuna delle operazioni rimanenti, associare l'evento OperationValidation al metodo ValidateUser.
Compilare la soluzione e verificare che i controlli di autorizzazione funzionino.
Se un utente con un nome diverso tenta di richiamare un'operazione sul servizio dopo che la variabile owner è stata impostata, al client verrà restituito il messaggio di errore seguente:
Security check failed.Nota
L'oggetto ClaimSet viene elaborato prima di PrincipalPermissionRole e di PrincipalPermissionName, pertanto se si eseguono due controlli di autorizzazione diversi a fronte di un gruppo di account NT, uno utilizzando ClaimSet e l'altro utilizzando PrincipalPermissionRole, verrà eseguito prima il controllo di autorizzazione ClaimSet.
Vedere anche
Attività
Attività 1: attivare l'autorizzazione basata sui ruoli nel servizio del flusso di lavoro
Altre risorse
Esercizio 2: implementazione delle funzionalità di protezione nel servizio del flusso di lavoro
Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.