c# - .NET WebApi HttpClient 不将 Windows 身份验证凭据发送到同一域

标签 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 的域与调用应用程序的域相同时才会收到 Unauthorized 响应。它在我的本地盒子上工作,因为 IIS Express 为每个应用程序分配了一个新端口。 IIS中出现匹配域的情况是因为我在IIS中将调用应用程序和API都创建为同一个站点下的应用程序,所以这两个应用程序看起来就像同一个域中的目录。如果 HttpClient 注意到域匹配,它几乎不会费心从调用 Web 应用程序发送身份验证。

我在同一台服务器上创建了一个新站点,但绑定(bind)到不同的端口并将 API 放在那里,然后重试。果然问题解决了,API的请求顺利通过。

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

谢谢!

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

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

仍然没有运气。

最佳答案

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

在我的例子中,它与 Windows Server 2012 上的情况相同,但知识库中的解决方案仍然适用。环回检查将阻止凭据在同一主机上通过 httpClient 发送,这会导致 401。对我来说,唯一的解决方法是方法 2 - 在注册表中设置 DisableLoopbackCheck。我知道这是一项安全“功能”,但它肯定是在经典 Windows 环境中使用现代面向服务的体系结构的障碍。

关于c# - .NET WebApi HttpClient 不将 Windows 身份验证凭据发送到同一域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39105474/

相关文章:

c# - C# 4.0 以及可选参数和重载的组合是否会向您发出有关歧义的警告?

asp.net - 如何使用 ASP.NET 创建动态子域?

c# - 如何为每个用户打开单独的窗口

c# - C#将Windows窗体应用程序添加到控制台应用程序

c# - 从 LINQ 选择调用方法

c# - 无法让 System.Web.Optimization 与 Nancy Self Hosting 一起运行

c# - 单击按钮时执行客户端和服务器端功能 - 特定场景

asp.net-mvc - ASP.NET 跟踪在 MVC2 View 中工作吗?

php - Android 如何使用身份验证用户名和密码从以下 URL 从 Web 服务器获取响应

ios - 处理 Game Center 身份验证