.NET WebApi HttpClient未将Windows身份验证凭据发送到同一域

时间:2016-08-23 15:40:43

标签: c# asp.net authentication iis asp.net-web-api

我正在使用多个Intranet API来尝试构建一些具有所有应用程序共享的服务的应用程序。可以使用Javascript请求直接从GUI调用许多这些服务,但是其他服务器应用程序需要调用一些服务。

所有前端和API都使用Windows身份验证。现在我已将它设置为授权任何Windows身份验证用户。匿名身份验证已禁用。

我正在使用HttpClient从Web代码中连接到所需的服务。这是一个例子:

HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
client.BaseAddress = new Uri(ConfigurationManager.AppSettings["OtherServiceUrl"]);

client.DefaultRequestHeaders.Accept.Add(
    new MediaTypeWithQualityHeaderValue("application/json"));

SomeResponseObject responseObject;
HttpResponseMessage response = client.GetAsync("SomeController").Result;
if (response.IsSuccessStatusCode)
{
    responseObject = response.Content.ReadAsAsync<SomeResponseObject>().Result;
}
else
{
    throw new ApplicationException("API request not successful");
}

好消息是,当我在本地运行服务时,这很好用。坏消息是,当我部署到IIS时,对Web服务的调用因未经授权的响应而失败。

经过大量的摆弄,我意识到我唯一一次获得未经授权的响应是指目标API的域与调用应用程序的域相同。它在我的本地盒子上运行,因为IIS express为每个应用程序分配了一个新端口。 IIS中出现匹配域的情况,因为我在IIS中的同一站点下创建了调用应用程序和API作为应用程序,因此这两个应用程序看起来像是同一域中的目录。这几乎就像HttpClient如果注意到域名匹配,就不会费心从调用Web应用程序发送身份验证。

我在同一台服务器上创建了一个新站点,但绑定到另一个端口并将API放在那里,然后再次尝试。果然,这解决了问题,来自API的请求通过就好了。

我可以放入一堆子域来处理所有这些不同的服务,或者只是依靠使用不同的端口来使这些服务的域名独一无二,但我觉得这个限制到位很奇怪。有没有人知道我可以在处理程序或客户端上设置一个属性,或者我可以做些什么来允许在同一个IIS站点上运行的应用程序在使用Windows身份验证时通过HttpClient相互通信?

谢谢!

Per Sachin的建议,我也尝试将此添加到通过HttpClient发出API请求的应用程序的webconfig中:

<system.net>
  <defaultProxy useDefaultCredentials="true" />
</system.net>

仍然没有运气。

1 个答案:

答案 0 :(得分:5)

看看这个:https://support.microsoft.com/en-us/kb/926642

在我的情况下,它是Windows Server 2012上的相同方案,但KB中的解决方案仍然适用。环回检查将阻止凭据在它们位于同一主机上时通过httpClient发送,从而导致401.对我来说,唯一的解决方案是方法2 - 在注册表中设置DisableLoopbackCheck。我知道这是一个安全&#34;功能&#34;但它在传统的Windows环境中使用现代面向服务的架构肯定是一个障碍。