iis - 继续获取 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 运行时
仅供参考,我尝试在同一台机器上从 Visual Studio 运行 Web api,但也出现 401 错误
有什么我可以添加到 AD 以使我的开发机器可信的吗?
************************代码更改后的新问题**********
******************另一个更新****** 这肯定很奇怪,所以我安装了 Fiddler 4 看看发生了什么。但仍然没有运气。
然后我对 IIS HTTP 响应标头进行了更改
奇怪的是,当我运行 Fiddler 时,错误消失了,但当我关闭它时,它又回来了。
解决方案
这里有两件事:
- 401 响应是 Windows 身份验证的正常第一步。然后期望客户端重新发送带有凭据的请求。AJAX 请求不会自动执行此操作,除非您告诉它这样做。
要告诉它在跨域请求中发送凭据(稍后会详细介绍),您需要withCredentials
在使用 JavaScript 发出请求时设置该选项。
使用 jQuery,看起来像这样:
$.ajax({
url: url,
xhrFields: {
withCredentials: true
}
}).then(callback);
- 当浏览器地址栏中的 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)
推荐阅读
- javascript - 具有多个选项的 lodash 过滤器?
- vba - word VBA 中有没有办法找到嵌入的图片(inlineShape)扩展名(jpeg、png、emf...)?
- angular - 使用 Angular 6 的电子邮件验证可以在没有点的情况下工作
- python - 当条件在for循环内时,while循环不会中断
- r - 将数据表列转换为 xts
- java - Java/hibernate - c3p0 查询 MariaDB 时出错
- apache-spark - 提交到 Kubernetes 集群内的 Spark Master
- react-native - 使用 react-native 0.59 设置 RNN2 时出错
- asp.net - .NET Webforms 应用程序在短暂空闲后响应缓慢
- php - 正则表达式,只允许大括号内的字母数字字符和下划线和特定占位符