2011-10-31 29 views
3

我有以下情形:如何模拟在WorkflowApplication内执行的WCF客户端?

我有工作流应用程序对象运行工作流活动。在工作流活动逻辑中,我调用了一个WCF服务,其中服务操作也作为一组活动生成。

的问题是:如何凭据传递和冒充其他用户在这种情况下,它这样做定期:

MyServiceClient client = new MyServiceClient(); 
client.ClientCredentials.Windows.ClientCredential.Domain = domain; 
client.ClientCredentials.Windows.ClientCredential.UserName = username; 
client.ClientCredentials.Windows.ClientCredential.Password = password; 

我试图模拟运行的工作流应用程序对象的代码块,但在这种情况下,我会收到一些异常,说“无法加载文件或程序集....访问被拒绝”。据我所知,这个例外的原因是工作流应用程序试图调用原始登录用户下的程序集。

请帮忙吗?

回答

0

使用调用进程的凭据进行Windows身份验证是受支持的最佳身份验证方法,但在WF CodePlex站点(https://wf.codeplex.com/releases/view/48114)上的WF Security Pack CTP 1中有处理用户名/密码身份验证的活动。见TokenFlowScopeGetUserNameSecurityToken。本文将详细介绍它:http://msdn.microsoft.com/en-us/magazine/gg598919.aspx。我没有尝试过,如果可能的话,会尽量避免。

对于第二个问题,在WorkflowApplication impersonate下运行工作流还有一点。来自同一篇文章:

调用线程的安全上下文没有复制到工作流线程,所以即使工作流客户端正在模拟,正在执行活动的WF线程也不会冒充。来电者的安全上下文可以使用,将其转发传入异步线程上调用,类似由WorkflowInvoker

public class MySyncContext : SynchronizationContext 
{ 
    public override void Post(SendOrPostCallback d, object state) 
    { 
    d(state); 
    } 
} 
使用的同步上下文的自定义同步范围内飞到WF线程