Servicios WF4 e integración WIF

¿Existen patrones probados que cualquiera pueda compartir con respecto a los servicios de Workflow 4.0 integrados con Windows Identity Foundation? Buscamos la mejor manera de inspeccionar el token de STS y las reclamaciones para derivar quién es el usuario fuera del contexto de la instancia del servicio de flujo de trabajo y hacer que el objeto de usuario de la aplicación esté disponible para el contexto del flujo de trabajo.

Queremos mantener la separación de preocupaciones entre la implementación de servicios de WIF y la lógica empresarial del flujo de trabajo para que nuestros servicios de flujo de trabajo sean altamente probables. Hemos visto algunos ejemplos proporcionados que apuntan a envolver la actividad de recepción con una actividad de código que instancia una implementación de IReceiveMessageCallback para obtener una referencia al OperationContext. Enlace a la publicación del blog de Maurice. Sin embargo, esto significa que las actividades internas del servicio dependen de la existencia del contexto de operación y posiblemente incluso de IClaimsIdentity.

La mejor solución que se nos ha ocurrido hasta ahora es crear una implementación de IDispatchMessageInspector para el servicio que interroga al token y crea los objetos de usuario de la aplicación necesarios para el flujo de trabajo, poniéndolos a disposición del tiempo de ejecución del flujo de trabajo a través de InstanceContext.Extensions. Esto parece funcionar, pero no se siente exactamente sólido. ¡Cualquier ayuda o comentario es muy apreciado!

Comportamiento de servicio

public class SecurityTokenServiceBehavior : IServiceBehavior, IDispatchMessageInspector
{
...
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        var claimsPrincipal = (IClaimsPrincipal)(Thread.CurrentPrincipal is GenericPrincipal ? null : Thread.CurrentPrincipal);

        ...

        instanceContext.Extensions.Add(new SecurityContextExtension(appUser, audit));
        return null;
    }
...
}

IReceiveMessageCallback

public class SecurityContextCallback : IReceiveMessageCallback
{
    [DataMember]
    public SecurityContextExtension SecurityContext { get; private set; }

    public void OnReceiveMessage(OperationContext operationContext, ExecutionProperties activityExecutionProperties)
    {
        SecurityContext = operationContext.InstanceContext.Extensions.Find<SecurityContextExtension>();
    }
}

preguntado el 16 de mayo de 11 a las 20:05

1 Respuestas

¿Has visto este entrada de blog sobre el uso de ClaimsAuthorizationManager ¿también? Utilizando la ClaimsAuthorizationManager es la forma habitual de comprobar la autorización cuando se utiliza WIF.

Ver publicación de Dominick aquí para ver algún ejemplo sobre cómo incrustar comprobaciones en su código utilizando el ClaimsAuthorize atributo o la estática ClaimsAuthorize.CheckAccess() método. Es posible que también desee echar un vistazo a WF Security Pack CTP 1 aquí.

contestado el 17 de mayo de 11 a las 13:05

¡Gracias Maurice! Esperábamos que saltaras sobre este. Nos encontramos con la publicación ClaimsAuthorizationManager y planeamos usar algo similar para la autorización específica de la operación. Dado que WF Sec Pack sigue siendo CTP, todavía no nos sentimos cómodos con la implementación en producción. Dejando a un lado la autorización, queremos usar el token sec para crear un DTO que identifique al usuario de la aplicación y esté disponible para WF para que los flujos de trabajo no tengan que: 1) Envolver las actividades de recepción con una actividad de código que proporcione un IReceiveMessageCallback. 2) Tener dependencias WIF dentro de WF que lo hacen bastante rígido para probar - Capps

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.