.NET Core - 在 IIS 上使用 Windows 身份验证从 MVC 应用程序调用 Web API 导致 HttpRequestException 401(未经授权)状态代码

Posted

技术标签:

【中文标题】.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 【发布时间】:2017-07-15 10:07:28 【问题描述】:

我正在 .NET Core 1.1 上开发一个 Web 应用程序,其中包含一个 Web API 和一个 MVC 应用程序。当我在 IIS 上托管应用程序时尝试从应用程序内部调用 Web API 时遇到了问题。

我在同一个 IIS 网站上同时拥有 MVC 和 API 应用程序,并且都启用了 Windows 身份验证(使用 NTLM/协商提供程序)。

我在 web.config 中有 forwardWindowsAuthToken=true。

我可以直接从 Postman/Web Browser 调用 API URL 并接收 JSON 结果

所有 API 调用都在 HttpClient 中进行,其构造函数具有 UseDefaultCredentials = true 的 HttpClientHandler

如果我在我的桌面上运行 MVC 应用程序(通过带有调试功能的 Visual Studio 进行 IE)并让它指向 IIS 网站上的 Web API,我会得到正确的 JSON 结果并且不会出现 401 错误。

将 MVC 应用程序上的托管 URL 更改为 localhost 而不是完全限定的 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);
        
    

【问题讨论】:

【参考方案1】:

我花了很长时间才弄清楚这一点。如果您遇到这样的情况,您必须从 MVC 应用程序调用 Intranet 上的 Web API,并且它们位于同一站点(例如 http://my.websi.te/application 和 http://my.websi.te/application/api)并且遇到 401 错误,这是因为 Microsoft 已经在同一台服务器上内置回调循环检测。我按照 Microsoft 知识库located here 上的第一种方法解决了我的问题

【讨论】:

以上 MSKB 文章已损坏 - 未找到页面

以上是关于.NET Core - 在 IIS 上使用 Windows 身份验证从 MVC 应用程序调用 Web API 导致 HttpRequestException 401(未经授权)状态代码的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core--.net core 3.1 部署到 IIS

ASP.NET Core部署系列一:发布到IIS上

net core web 能部署到iis7么

asp.net怎么配置IIS6

ASP.NET Core api 项目 3.1 在 IIS 上发布

在 IIS 上托管的 ASP.NET Core WebApp 上提供持久配置