反思,WCF Web服务,LoadFrom汇编哦我的。网络凭据的问题

时间:2013-05-01 14:46:22

标签: wcf reflection networkcredentials

我已经创建了一个WCF Web服务,它可以动态调用其他带有.LoadFile(来自程序集')的DLL的webservices / db连接。在其中一个程序集中,另一个Web服务使用传入的网络凭据动态调用,如下所示:

WebClient client = new WebClient();
client.Credentials = this.networkCredential;  //This credential is passed in
RequestStream requestStream = client.OpenRead(this.url);

//代码的其余部分。 .OpenRead给出401错误(未授权)。

当我从测试控制台应用程序在调试模式下执行此操作并创建网络凭据时,如下所示:

NetworkCredential networkCredential = new NetworkCredential(<userid>,<password>,<domain>);

这很好。

失败的代码提供如下网络凭证

System.Net.NetworkCredential networkCredential = System.Net.CredentialCache.DefaultNetworkCredentials;

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

除非您使用模拟,否则DefaultNetworkCredentials会尝试使用运行ASP.NET网站的进程的凭据,而不是访问您网站的用户的凭据。为了使用用户的凭据,您应该在模拟上下文中对Web服务进行包装。

var impersonationContext = HttpContext.Current.Request.User.Identity.Impersonate();
if(impersonationContext != null)
{
    //call your webservice here.  DefaultNetworkCredentials will be what you expect.
    impersonationContext.Undo();
}

当然有条件。必须对用户进行身份验证(不能是匿名用户,除非匿名用户也可以访问您的Web服务)。此外,上面的代码只是一个例子 - 在生产代码中还有很多其他的事情需要考虑。这是一个msdn article,可以帮助您入门。

仅供参考,它在开发中工作的原因很可能是因为您的开发服务器进程以您的身份运行,并且由于您可以访问Web服务,因此它会成功。