.NET Core - 在 IIS 上使用 Windows 身份验证从 MVC 应用程序调用 Web API 导致 HttpRequestException 401(未经授权)状态代码
.NET Core - Calling Web API from MVC Application with Windows Authentication on IIS Results In HttpRequestException 401 (Unauthorized) Status Code
我正在 .NET Core 1.1 上开发 Web 应用程序,同时包含 Web API 和 MVC 应用程序。当我尝试从托管在 IIS 上的应用程序中调用 Web API 时,我遇到了一个问题。
我在同一个 IIS 网站上同时拥有 MVC 和 API 应用程序,并且都启用了 Windows 身份验证(使用 NTLM/Negotiate 提供程序)。
我在 web.config 中有 forwardWindowsAuthToken=true。
我可以直接从 Postman/Web 浏览器调用 API URL 并接收 JSON 结果
所有 API 调用均在 HttpClient 中进行,其构造函数具有 UseDefaultCredentials = true
如果我 运行 我桌面上的 MVC 应用程序(即通过 visual studio w/ 调试)并将其指向 IIS 上的 Web API网站,我得到正确的 JSON 结果并且没有 401 错误。
将 MVC 应用程序上的托管 URL 更改为本地主机而不是完全限定的 URL 对问题没有影响
我认为这与 ASP.NET Core 没有将正确的凭据从我的 MVC 应用程序转发到 Web API 有关。我花了几个小时试图找到处于完全相同情况下的人,但大多数解决方案和问题的变化与此略有不同,为这些提出的解决方案对我没有任何帮助。
任何人都可以阐明这个问题或指出我做错了什么吗?下面是一个 API 调用的示例,我将为基本索引页面调用...
public async Task<IncidentWrapper> GetIndex(int limit, int offset)
{
using (var client = new HttpClient(new HttpClientHandler { UseDefaultCredentials = true }))
{
var response = await client.GetStringAsync("https://<some.server.name>/<appname>/api/v1/Incidents?limit=10&offset=0");
return JsonConvert.DeserializeObject<IncidentWrapper>(response);
}
}
我花了太长时间才弄明白这一点。如果您遇到必须在内部网上调用 Web API 形成 MVC 应用程序并且它们在同一站点上的情况(例如 http://my.websi.te/application and http://my.websi.te/application/api) and you encounter 401 errors, it's because Microsoft has built in callback loop detection on the same server. I fixed my issue by following the first method on the Microsoft Knowledge base located here
我正在 .NET Core 1.1 上开发 Web 应用程序,同时包含 Web API 和 MVC 应用程序。当我尝试从托管在 IIS 上的应用程序中调用 Web API 时,我遇到了一个问题。
我在同一个 IIS 网站上同时拥有 MVC 和 API 应用程序,并且都启用了 Windows 身份验证(使用 NTLM/Negotiate 提供程序)。
我在 web.config 中有 forwardWindowsAuthToken=true。
我可以直接从 Postman/Web 浏览器调用 API URL 并接收 JSON 结果
所有 API 调用均在 HttpClient 中进行,其构造函数具有 UseDefaultCredentials = true
如果我 运行 我桌面上的 MVC 应用程序(即通过 visual studio w/ 调试)并将其指向 IIS 上的 Web API网站,我得到正确的 JSON 结果并且没有 401 错误。
将 MVC 应用程序上的托管 URL 更改为本地主机而不是完全限定的 URL 对问题没有影响
我认为这与 ASP.NET Core 没有将正确的凭据从我的 MVC 应用程序转发到 Web API 有关。我花了几个小时试图找到处于完全相同情况下的人,但大多数解决方案和问题的变化与此略有不同,为这些提出的解决方案对我没有任何帮助。
任何人都可以阐明这个问题或指出我做错了什么吗?下面是一个 API 调用的示例,我将为基本索引页面调用...
public async Task<IncidentWrapper> GetIndex(int limit, int offset)
{
using (var client = new HttpClient(new HttpClientHandler { UseDefaultCredentials = true }))
{
var response = await client.GetStringAsync("https://<some.server.name>/<appname>/api/v1/Incidents?limit=10&offset=0");
return JsonConvert.DeserializeObject<IncidentWrapper>(response);
}
}
我花了太长时间才弄明白这一点。如果您遇到必须在内部网上调用 Web API 形成 MVC 应用程序并且它们在同一站点上的情况(例如 http://my.websi.te/application and http://my.websi.te/application/api) and you encounter 401 errors, it's because Microsoft has built in callback loop detection on the same server. I fixed my issue by following the first method on the Microsoft Knowledge base located here