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

Gue*_*att 7 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");
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

我可以把一堆子域来处理所有这些不同的服务,或者仅仅依靠以使独特的这些服务的域使用不同的端口,但它似乎有些奇怪,我认为这个限制是到位.有谁知道,如果有我可以在处理程序或客户端或别的东西,我可以做,以允许在同一个IIS站点运行的应用程序通过的HttpClient当使用Windows身份验证来相互交谈设置属性?

谢谢!

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

<system.net>
  <defaultProxy useDefaultCredentials="true" />
</system.net>
Run Code Online (Sandbox Code Playgroud)

仍然没有运气.

小智 5

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

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