Iis 继续获取未经授权的Web API

Iis 继续获取未经授权的Web API,iis,asp.net-web-api,windows-authentication,http-status-code-401,Iis,Asp.net Web Api,Windows Authentication,Http Status Code 401,我有一个项目,它是一个需要Windows身份验证的web应用程序 我已经使用NAS虚拟化在家中设置了Active Directory。然后,我为IIS创建了一个VMWare服务器,它是我桌面上该域的一个成员,我也使用它进行开发。我已经创建了Web API并将其安装到VMWare服务器中。当我直接调用一个例程时,它会工作并返回结果,但当我使用javascript Web应用程序中的webapi例程时,我会不断收到401错误。然后我将代码放在IIS服务器上,web应用程序就可以工作了 我见过很多解决

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

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

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

*****根据评论上的请求进行更新*****

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

从Javascript调用Web API

这是我得到的错误

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

有什么我可以添加到广告,使我的开发机器作为信任

********************代码更改后的新问题**********

****************另一个更新****** 这确实很奇怪,所以我安装了Fiddler 4来看看发生了什么。但还是没有运气

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


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

这里发生了两件事:

  • 401响应是Windows身份验证的正常第一步。然后,客户端需要使用凭据重新发送请求。AJAX请求不会自动执行此操作,除非您告诉它
  • 要告诉它在跨域请求中发送凭据(稍后将详细介绍),您需要在JavaScript中发出请求时设置该选项

    使用jQuery,情况如下所示:

    $.ajax({
    url:url,
    xhrFields:{
    证书:正确
    }
    }).然后(回调);
    
  • 当浏览器地址栏中的URL与JavaScript中试图连接的API的URL不同时,就会出现这些问题。浏览器对何时允许这样做非常挑剔。这些被称为“跨域请求”,或“跨源资源共享”(CORS)
  • 它查看协议、域名和端口。所以如果网站是
    http://localhost:8000
    ,它正在向
    http://localhost:8001
    ,仍被视为跨域请求

    当发出跨域AJAX请求时,浏览器首先向URL发送一个选项请求,该URL包含发出请求的网站的URL(例如
    http://localhost:8000
    )。该API将返回一个带有
    访问控制允许来源
    标题的响应,该标题说明是否允许发出请求的网站访问

    如果您不打算发送凭据,则
    访问控制允许来源
    标题可以是
    *
    ,这意味着API允许任何人调用它

    但是,如果您需要发送凭据(如您所做的),则不能使用
    *
    Access Control Allow Origin
    标题必须专门包含网页的域(和端口),并且
    Access Control Allow Credentials
    必须设置为
    true
    。例如:

    Access-Control-Allow-Origin: http://localhost:8000
    Access-Control-Allow-Credentials: true
    
    是的,屁股有点痛。但这是安全的需要


    您可以在此处阅读有关CORS的更多信息:

    401响应是Windows身份验证的正常第一步。然后由应用程序重复请求,包括凭据。您能否显示您用于发出请求的代码?401通常是一种自动实现的方法,如果它现在不这样做的话。401是服务器的基本质询响应。当您访问windows身份验证时,服务器将返回401,web浏览器将提示输入windows凭据。那么,你的意思是说你可以通过web浏览器访问web api,但从javascript调用时失败了吗?@JokiesDing,没错。在同一个浏览器上,当我运行web api时,它会显示结果,但当它来自javascript时,401问题就发生了。@GabrielLuci,我根据您的评论添加了一个更新。Gabriel,错误消失了,但我得到了不同的错误(我将在我的帖子中更新)。另一个问题是,当我在我们的公司域中运行相同的代码时,它不需要任何添加就可以工作。只有在我的域上运行时才会出现问题。我只想补充一点,我只是在运行一个本地HTML文件来测试这一点。您需要修复
    访问控制允许源文件
    标题。您必须指定从中运行的站点的确切协议、域和端口(即使是本地的)。例如:
    访问控制允许原点:http://localhost:8000
    否则浏览器将不会发送凭据。当您说“修复”时?它在Web API上吗?IIS?或者在javascript上。我只是不明白为什么这段代码在我们公司的域名上有效,我的域名里有所有这些问题。我想知道我是否缺少Active Directory级别的内容。我已经联系了创建我的工作服务器的IT人员,他们告诉我他们在该服务器上没有做任何特殊的事情。我甚至试着做了一次又一次的尝试,但还是没有成功。我更新了我的答案,补充了更多细节。简短的版本是,您需要更改
    Access Control Allow Origin
    标题以包含您从中调用它的确切网站。