首页 > 解决方案 > 继续获取 Unauthorize Web API

问题描述

我有一个项目,它是一个需要 Windows 身份验证的 Web 应用程序。

我已经使用我的 NAS 虚拟化在家中设置了 Active Directory。然后我为 IIS 创建了一个 VMWare 服务器,它是我桌面上该域的成员,我也用于开发。我已经创建了 Web API 并将其安装到那个 VMWare 服务器中。当我直接调用例程时,它可以工作并返回结果,但是当我从我的 javascript Web 应用程序中使用 Web API 例程时,我不断收到 401 错误。然后我将代码放在 IIS 服务器上,Web 应用程序就可以工作了。

我见过很多解决方案,比如在 IIS 身份验证中更改 Provider 的顺序。添加了每个人对文件夹的读/写权限。我还在 web.config 上添加了条目。但它们都不起作用。

*****根据评论的要求更新*****

下面是我直接从 Web API 运行时

在此处输入图像描述

从 Javascript 调用 Web API 在此处输入图像描述

在此处输入图像描述

这是我得到的错误 在此处输入图像描述 在此处输入图像描述

仅供参考,我尝试在同一台机器上从 Visual Studio 运行 Web api,但也出现 401 错误

在此处输入图像描述

有什么我可以添加到 AD 以使我的开发机器可信的吗?

************************代码更改后的新问题********** 在此处输入图像描述

******************另一个更新****** 这肯定很奇怪,所以我安装了 Fiddler 4 看看发生了什么。但仍然没有运气。

然后我对 IIS HTTP 响应标头进行了更改

在此处输入图像描述

在此处输入图像描述

奇怪的是,当我运行 Fiddler 时,错误消失了,但当我关闭它时,它又回来了。

标签: iisasp.net-web-apiwindows-authenticationhttp-status-code-401

解决方案


这里有两件事:

  1. 401 响应是 Windows 身份验证的正常第一步。然后期望客户端重新发送带有凭据的请求。AJAX 请求不会自动执行此操作,除非您告诉它这样做。

要告诉它在跨域请求中发送凭据(稍后会详细介绍),您需要withCredentials在使用 JavaScript 发出请求时设置该选项。

使用 jQuery,看起来像这样:

$.ajax({
   url: url,
   xhrFields: {
      withCredentials: true
   }
}).then(callback);
  1. 当浏览器地址栏中的 URL 与您尝试在 JavaScript 中连接的 API 的 URL 不同时,会弹出这些问题。浏览器对何时允许这样做非常挑剔。这些被称为“跨域请求”或“跨域资源共享”(CORS)。

它查看协议、域名和端口。因此,如果网站是http://localhost:8000,并且它正在向 发出 AJAX 请求http://localhost:8001,则仍将其视为跨域请求。

当一个跨域的 AJAX 请求被发出时,浏览器首先向 URL 发送一个 OPTIONS 请求,其中包含发出请求的网站的 URL(例如http://localhost:8000)。API 应返回带有标头的响应,该Access-Control-Allow-Origin标头说明是否允许发出请求的网站。

如果您不打算发送凭据,则Access-Control-Allow-Origin标头可以是*,这意味着 API 允许任何人调用它。

但是,如果您需要像您一样发送凭据,则不能使用*. 标Access-Control-Allow-Origin头必须明确包含您网页的域(和端口),并且Access-Control-Allow-Credentials必须设置为true. 例如:

Access-Control-Allow-Origin: http://localhost:8000
Access-Control-Allow-Credentials: true

是的,屁股有点痛。但为了安全,这是必要的。

您可以在此处阅读有关 CORS 的更多信息:跨域资源共享 (CORS)


推荐阅读