. net WebApi HttpClient不发送Windows身份验证凭据到同一域

本文关键字:身份验证 Windows HttpClient WebApi net | 更新日期: 2023-09-27 18:03:33

我正在使用多个内部网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中,因为我将调用应用程序和API都创建为IIS中同一站点下的应用程序,因此这两个应用程序看起来像同一域中的目录。这几乎就像HttpClient不麻烦从调用web应用程序发送身份验证,如果它注意到域名匹配。

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

我可以放入一堆子域来处理所有这些不同的服务,或者仅仅依靠使用不同的端口来使这些服务的域唯一,但对我来说,这种限制似乎很奇怪。有没有人知道,如果有一个属性,我可以设置在处理程序或客户端或其他东西,我可以做的是,允许在同一IIS网站上运行的应用程序,通过HttpClient互相交谈时使用Windows身份验证?

谢谢!

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

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

还是没有运气

. net WebApi HttpClient不发送Windows身份验证凭据到同一域

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

在我的例子中,这是Windows Server 2012上的相同场景,但KB中的解决方案仍然适用。环回检查将防止凭据在同一主机上时通过httpClient发送,这会导致401。对我来说,唯一的解决方案是方法2 -在注册表中设置DisableLoopbackCheck。我理解这是一个安全"特性",但它无疑是在经典Windows环境中使用现代面向服务架构的障碍。