是否有任何人可以分享有关与Windows Identity Foundation集成的Workflow 4.0服务的经过验证的模式?我们正在寻找检查STS令牌和声明的最佳方法,以便派生用户在工作流服务实例上下文之外的人,并使应用程序的用户对象可用于工作流上下文。
我们希望保持WIF的服务实现与工作流业务逻辑之间的关注点分离,以便我们的工作流服务具有高度可测性。我们已经看到提供了一些示例,这些示例指向使用代码活动包装Receive活动,该代码活动实例化IReceiveMessageCallback的实现以获取对OperationContext的引用。 Link to Maurice's Blog Post.但是,这意味着服务内部的活动依赖于操作上下文的存在,甚至可能依赖于IClaimsIdentity。
我们目前可以提出的最佳解决方案是为服务创建IDispatchMessageInspector实现,该服务询问令牌并创建工作流所需的应用程序用户对象,使其可通过InstanceContext.Extensions提供给工作流运行时。这似乎有效,但感觉不完全稳固。非常感谢任何帮助或反馈!
服务行为
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>();
}
}