0

我创建了一个 WCF webservice,它可以动态调用其他 webservices/db 连接,并使用 .LoadFile('from assembly') 加载 DLL。在其中一个程序集中,使用传入的网络凭据动态调用另一个 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;

任何帮助将不胜感激。

4

1 回答 1

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 文章,可以帮助您入门。

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

于 2013-05-03T16:41:48.497 回答