如何在启用基本身份验证的情况下启用对 Web API 中所有来源的访问?
Posted
技术标签:
【中文标题】如何在启用基本身份验证的情况下启用对 Web API 中所有来源的访问?【英文标题】:How to enable access to all origins in Web API with basic authentication enabled? 【发布时间】:2019-09-21 00:19:17 【问题描述】:我想通过在 Web API 中启用基本身份验证来允许访问所有来源,但是每当我尝试通过 ajax 调用 API 时,它都会给出错误说明
请求的资源上不存在“Access-Control-Allow-Origin”标头。 (CORS 问题)
我尝试了下面提到的 sn-p(在 webapiconfig 中)。 它在 localhost 中运行良好,但在 IIS 中托管后又出现同样的错误。
var corsAttr = new EnableCorsAttribute("*", "*", "*") SupportsCredentials = true ;
config.EnableCors(corsAttr);
我已经从以下链接实现了基本身份验证:
https://www.c-sharpcorner.com/blogs/basic-authentication-in-webapi
还尝试评论上述 sn-p 和 在 Web.config 中添加以下行,但这也失败了
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Headers" value="Authorization, Content-Type"/>
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE"/>
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>
</httpProtocol>
AJAX 调用:
function post()
var data = xyz;
$.ajax(
url : 'http://localhost:8080/api/demo',
type: 'POST',
dataType: 'json',
data: data,
headers: 'Authorization': 'Basic ' + btoa('abc' + ":" + 'xyz') ,
success: function (response)
alert('Success');
,
error: function (response) alert('Error');
);
我希望无论来源如何,都应该使用凭据访问我的 API。
【问题讨论】:
调用被浏览器而不是API阻止。 这种情况下需要做什么 你是否在你的 startup.cs 中添加了 AllowAnyOrigin() ? 【参考方案1】:使用以下命令禁用 Chrome 中的同源策略。
1.关闭 Chrome。
2.打开运行。
3.Type chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security
并尝试调用 API。
【讨论】:
非常感谢您回答这个问题,我尝试使用此命令,但浏览器显示 - 您正在使用不受支持的命令行标志:--disable-web-security。稳定性和安全性将受到影响。我尝试运行 API,但它抛出了相同的上述错误。 另外,如果我们可以进行编码更改会更好。【参考方案2】:有时其他错误会导致CORS
错误。就我而言,我正在为CORS
错误而苦苦挣扎,我已经尝试了所有方法。
当我尝试使用 wireshark 工具监控服务器上的传入请求时,我意识到我的请求根本没有到达服务器。
事实上,虽然CORS
错误让我认为错误是由于应用程序上的配置造成的,但这是一个防火墙问题,整个服务都无法访问。在防火墙CORS
上进行正确配置后,错误也消失了
【讨论】:
以上是关于如何在启用基本身份验证的情况下启用对 Web API 中所有来源的访问?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用默认域在 Web.config 中启用基本身份验证和匿名身份验证?
如何在启用电话身份验证的情况下导出 Firebase 用户帐户
如何在 ASP.Net Web API 中为特定控制器启用 Windows 身份验证
在启用身份验证的情况下,无法使用 DriverManager.getConnection(url, properties) 连接到 Derby