【问题标题】:Keep on getting Unauthorize Web API继续获取 Unauthorize Web API
【发布时间】:2019-10-17 00:54:09
【问题描述】:

我有一个项目,它是一个需要 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 时,错误消失了,但当我关闭它时,它又回来了。

【问题讨论】:

  • 401 响应是 Windows 身份验证中正常的第一步。然后由应用程序重复请求,包括凭据。你能显示你用来发出请求的代码吗?如果现在不这样做,这通常是一种自动发生这种情况的方法。
  • 401 是您服务器的基本质询响应。当你访问windows认证时,服务器会返回401,浏览器会提示输入windows凭证。那么你的意思是你可以通过网络浏览器访问网络 api,但是当你从 javascript 调用它时会失败?
  • @JokiesDing,没错。在同一个浏览器上,当我运行 web api 时,它会显示结果,但是当它来自 javascript 时,就会出现 401 问题。
  • @GabrielLuci,我已根据您的评论添加了更新。

标签: iis asp.net-web-api windows-authentication http-status-code-401


【解决方案1】:

这里发生了两件事:

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

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

使用 jQuery,看起来像这样:

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

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

当发出跨域 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 的更多信息:Cross-Origin Resource Sharing (CORS)

【讨论】:

  • Gabriel,错误消失了,但我得到了不同的错误(我会在我的帖子中更新)。另一个问题是,当我在公司域中运行相同的代码时,它无需任何添加即可工作。只有在我的域上运行时才会出现问题
  • 我只是想补充一点,我只是在运行一个本地 HTML 文件来测试它。
  • 您需要修复 Access-Control-Allow-Origin 标头。您必须指定正在运行的站点的确切协议、域和端口(即使是本地站点)。例如:Access-Control-Allow-Origin: http://localhost:8000 否则浏览器不会发送凭据。
  • 当你说修复它?它在 Web API 上吗? IIS?或在 javascript 上。我只是不明白为什么这段代码适用于我们公司的域,而我的域中存在所有这些问题。我想知道我是否在 Active Directory 级别上遗漏了一些东西。我联系了创建我的工作服务器的 IT 人员,他们告诉我他们没有在该服务器上做任何特别的事情。我什至试着让它喜欢,但仍然没有运气。
  • 我用更多细节更新了我的答案。简短的版本是您需要更改 Access-Control-Allow-Origin 标头以包含您从中调用它的确切网站。 You cannot use a wildcard.
猜你喜欢
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2023-03-17
  • 2012-10-29
相关资源
最近更新 更多