【发布时间】:2012-08-26 01:56:39
【问题描述】:
我有一个与 Windows 服务通信的 Web 应用程序(托管在 IIS 中)。 Windows 服务使用 ASP.Net MVC Web API(自托管),因此可以使用 JSON 通过 http 进行通信。 Web 应用程序被配置为进行模拟,其想法是向 Web 应用程序发出请求的用户应该是 Web 应用程序用来向服务发出请求的用户。结构如下:
(以红色突出显示的用户是以下示例中提到的用户。)
Web 应用程序使用 HttpClient 向 Windows 服务发出请求:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
这会向 Windows 服务发出请求,但不会正确传递凭据(服务将用户报告为 IIS APPPOOL\ASP.NET 4.0)。 这不是我想要发生的事情。
如果我将上述代码更改为使用WebClient,则用户的凭据将正确传递:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
使用上面的代码,服务将用户报告为向 Web 应用程序发出请求的用户。
HttpClient 实现我做错了什么导致它无法正确传递凭据(或者它是 HttpClient 的错误)?
我想使用HttpClient 的原因是它有一个异步API,可以很好地与Tasks 配合使用,而WebClient 的异步API 需要处理事件。子>
【问题讨论】:
-
似乎 HttpClient 和 WebClient 认为不同的东西是 DefaultCredentials。你试过 HttpClient.setCredentials(...) 吗?
-
顺便说一句,WebClient在.Net 4.5中有
DownloadStringTaskAsync,也可以和async/await一起使用 -
@GermannArlington:
HttpClient没有SetCredentials()方法。你能指出我的意思吗? -
看来这已被修复(.net 4.5.1)?我尝试在经过 Windows 身份验证的用户访问的 Web 服务器上创建
new HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true },然后该网站确实对另一个远程资源进行了身份验证(如果没有设置标志就不会进行身份验证)。
标签: c# asp.net-web-api impersonation windows-security