Procedura: creare un gestore autorizzazioni personalizzato per un servizio
L'infrastruttura dei modelli di identità di Windows Communication Foundation (WCF) supporta un modello di autorizzazione basato su attestazioni estensibili. Le attestazioni vengono estratte dai token, elaborate facoltativamente da criteri di autorizzazione personalizzati e quindi inserite in una classe AuthorizationContext. Un gestore autorizzazioni esamina le attestazioni contenute nel contesto AuthorizationContext per prendere decisioni di autorizzazione.
Per impostazione predefinita, le decisioni di autorizzazione sono prese dalla classe ServiceAuthorizationManager. È tuttavia possibile creare un gestore autorizzazioni personalizzato per eseguire l'override di queste decisioni. Per creare un gestore autorizzazioni personalizzato, creare una classe che deriva da ServiceAuthorizationManager e che implementa il metodo CheckAccessCore. Le decisioni di autorizzazione sono prese tramite il metodo CheckAccessCore che restituisce true quando l'accesso è concesso e false quando l'accesso è negato.
Se la decisione di autorizzazione dipende dal contenuto del corpo del messaggio, utilizzare il metodo CheckAccess.
A causa di problemi riguardanti le prestazioni, è consigliabile ridisegnare l'applicazione, se possibile, in modo tale che per la decisione di autorizzazione non sia necessario l'accesso al corpo del messaggio.
La registrazione del gestore autorizzazioni personalizzato per un servizio può essere eseguita in codice o in configurazione.
Per creare un gestore autorizzazioni personalizzato
Derivare una classe dalla classe ServiceAuthorizationManager.
Eseguire l'override del metodo CheckAccessCore.
Utilizzare il contesto OperationContext passato al metodo CheckAccessCore per prendere decisioni di autorizzazione.
Nell'esempio di codice seguente il metodo FindClaims viene utilizzato per individuare l'attestazione personalizzata
https://www.contoso.com/claims/allowedoperation
allo scopo di prendere una decisione di autorizzazione.
Per registrare un gestore autorizzazioni personalizzato in codice
Creare un'istanza del gestore autorizzazioni personalizzato e assegnarla alla proprietà ServiceAuthorizationManager.
Per accedere al comportamento ServiceAuthorizationBehavior è possibile utilizzare la proprietà Authorization.
Nell'esempio di codice seguente viene illustrato come registrare il gestore autorizzazioni personalizzato
MyServiceAuthorizationManager
.
Per registrare un gestore autorizzazioni personalizzato in configurazione
Aprire il file di configurazione del servizio.
Aggiungere un serviceAuthorization element all'Behaviors element.
Aggiungere un attributo serviceAuthorizationManagerType all'serviceAuthorization element e quindi impostare il valore di tale attributo sul tipo che rappresenta il gestore autorizzazioni personalizzato.
Aggiungere un'associazione in grado di proteggere la comunicazione tra client e servizio.
L'associazione scelta per questa comunicazione determina le attestazioni aggiunte al contesto AuthorizationContext utilizzate dal gestore autorizzazioni personalizzato per prendere le decisioni di autorizzazione. Per ulteriori dettagli sulle associazioni fornite dal sistema, vedere Associazioni fornite dal sistema.
Associare il comportamento a un endpoint di servizio aggiungendo un elemento <service> e quindi impostare il valore dell'attributo behaviorConfiguration sul valore dell'attributo nome dell'elemento <behavior> of <serviceBehaviors>.
Per ulteriori informazioni sulla configurazione di un endpoint di servizio, vedere Procedura: creare un endpoint di servizio nella configurazione.
Nell'esempio di codice seguente viene illustrato come registrare il gestore autorizzazioni personalizzato
Samples.MyServiceAuthorizationManager
.<configuration> <system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior"> <host> <baseAddresses> <add baseAddress="https://localhost:8000/ServiceModelSamples/service"/> </baseAddresses> </host> <endpoint address="" binding="wsHttpBinding_Calculator" contract="Microsoft.ServiceModel.Samples.ICalculator" /> </service> </services> <bindings> <WSHttpBinding> <binding name = "wsHttpBinding_Calculator"> <security mode="Message"> <message clientCredentialType="Windows"/> </security> </binding> </WSHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="CalculatorServiceBehavior"> <serviceAuthorization serviceAuthorizationManagerType="Samples.MyServiceAuthorizationManager" /> </behaviors> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Esempio
Nell'esempio di codice seguente viene descritta un'implementazione di base di una classe ServiceAuthorizationManager che prevede l'override del metodo CheckAccessCore. Nell'esempio di codice viene eseguita una ricerca all'interno del contesto AuthorizationContext allo scopo di individuare un'attestazione personalizzata e quindi viene restituito true quando la risorsa relativa a tale attestazione personalizzata corrisponde al valore di azione indicato nel contesto OperationContext. Per un'implementazione più completa di una classe ServiceAuthorizationManager, vedere Authorization Policy Sample.