Cómo crear un administrador de autorización personalizado para un servicio
La infraestructura del Modelo de identidad en Windows Communication Foundation (WCF) admite un modelo de la autorización basado en demandas extensible. Las demandas se extraen de los tokens y opcionalmente son procesadas por directivas de autorización personalizadas y, a continuación, colocadas en AuthorizationContext. Un administrador de autorización examina las demandas en AuthorizationContext para tomar las decisiones de autorización.
La clase ServiceAuthorizationManager toma de forma predeterminada, las decisiones de la autorización; sin embargo estas decisiones se pueden invalidar creando un administrador de autorización personalizado. Para crear un administrador de autorización personalizado, cree una clase que derive de ServiceAuthorizationManager e implemente el método CheckAccessCore. Las decisiones de la autorización se toman en el método CheckAccessCore, que devuelve true cuando se permite el acceso y false cuando se niega el acceso.
Si la decisión de autorización depende del contenido del cuerpo del mensaje, utilice el método CheckAccess.
Debido a los problemas de rendimiento, en la medida de lo posible debe rediseñar su aplicación para que la decisión de autorización no requiera el acceso al cuerpo del mensaje.
El registro del administrador de autorización personalizado para un servicio se puede hacer en código o configuración.
Para crear un administrador de autorización personalizado
Derive una clase de la clase ServiceAuthorizationManager.
Invalide el método CheckAccessCore.
Utilice el OperationContext que se pasa al método CheckAccessCore para tomar las decisiones de autorización.
El siguiente ejemplo de código utiliza el método FindClaims para buscar el
https://www.contoso.com/claims/allowedoperation
de la notificación personalizada y tomar una decisión de autorización.
Para registrar a un administrador de autorización personalizado mediante código
Cree una instancia del administrador de autorización personalizado y asígnelo a la propiedad ServiceAuthorizationManager.
Se puede tener acceso a ServiceAuthorizationBehavior mediante la propiedad Authorization.
El ejemplo de código siguiente registra el administrador de autorización personalizado
MyServiceAuthorizationManager
.
Para registrar a un administrador de autorización personalizado mediante configuración
Abra el archivo de configuración para el servicio.
Agregue serviceAuthorization element a Behaviors element.
Para el serviceAuthorization element, agregue un atributo serviceAuthorizationManagerType y establezca su valor en el tipo que represente al administrador de autorización personalizado.
Agregue un enlace que proteja la comunicación entre el cliente y el servicio.
El enlace que se elige para esta comunicación determina las demandas que se agregan al AuthorizationContext, que el administrador de autorización personalizado utiliza para tomar las decisiones de autorización. Para obtener más detalles sobre los enlaces proporcionados por el sistema, vea Enlaces proporcionados por el sistema.
Asocie el comportamiento a un extremo de servicio, agregando un elemento <service> y establezca el valor del atributo behaviorConfiguration en el valor del atributo de nombre para el elemento <behavior> of <serviceBehaviors>.
Para obtener más información sobre la configuración de un extremo de servicio, vea Cómo crear un extremo de servicio en configuración.
El ejemplo de código siguiente registra el administrador de autorización personalizado
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>
Ejemplo
El ejemplo de código siguiente muestra una implementación básica de una clase ServiceAuthorizationManager que incluye la invalidación del método CheckAccessCore. El código de ejemplo examina AuthorizationContext para una demanda personalizada y devuelve true cuando el recurso para esa demanda de la costumbre coincide con el valor de la acción de OperationContext. Para una implementación más completa de una clase ServiceAuthorizationManager, vea Authorization Policy Sample.