如何在 WebAPI 中完全禁用 CORS

Sun*_*nny 9 cors asp.net-web-api

我们需要在 WebAPI 项目中禁用 CORS,我已经在Startup.cs类和public void Configuration(IAppBuilder app)方法中注释掉了下面的行。

        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
Run Code Online (Sandbox Code Playgroud)

通过线程,发送以下请求

curl -H "Origin: http://www.google.com" --verbose \ http://localhost:23422/api/values
Run Code Online (Sandbox Code Playgroud)

回复

HTTP/1/1 200 OK
Content-Type: application/json; charset=utf-8
Server: XXXX
X-SourceFiles: XXX
X-Powered-By: ASP.NET
[
 "value1",
 "value2"
]
Run Code Online (Sandbox Code Playgroud)

它确实有效并返回实际结果。这是否意味着 CORS 仍然受支持?我认为它不会返回任何值,因为我是从 google.com 请求的。

但是,当我尝试以下请求时。它返回405 Method Not Allowed

curl  -H "Access-Control-Request-Method: GET" -H "Origin: http://google.com" --head \ http://localhost:44312/api/values
Run Code Online (Sandbox Code Playgroud)

回复

HTTP/1/1 405 Method Not Allowed
Allow: GET,POST
Content-Type: application/json; charset=utf-8
Server: XXXX
X-SourceFiles: XXX
X-Powered-By: ASP.NET
{
  "message": "The requested resource does not support http method "OPTIONS"."
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*n27 14

这在 ASP Net Core 中对我有用:

\n

我有类似的问题。

\n

在startup.cs-ConfigureServices中:

\n
services.AddCors();\n
Run Code Online (Sandbox Code Playgroud)\n

在startup.cs中-配置:

\n
 // global cors policy\n                app.UseCors(x => x\n                    .AllowAnyMethod()\n                    .AllowAnyHeader()\n                    .SetIsOriginAllowed(origin => true) // allow any origin\n                    //.WithOrigins("https://localhost:44351")); // Allow only this origin can also have multiple origins separated with comma\n                    .AllowCredentials()); // allow credentials\n
Run Code Online (Sandbox Code Playgroud)\n

安装 NuGet 包: Microsoft.AspNetCore.Cors

\n
<PackageReference Include="Microsoft.AspNetCore.Cors" Version="2.2.0" />\n
Run Code Online (Sandbox Code Playgroud)\n

现在可以使用 ex 从浏览器调用 api。JavaScript。

\n

在这里找到: \n https://jasonwatmore.com/post/2020/05/20/aspnet-core-api-allow-cors-requests-from-any-origin-and-with-credentials

\n

示例 - 从 JS fetch api 访问:

\n

在JS APP中: - 获取api:

\n
mode: \'cors\', \ncredentials: \'include\'  \n
Run Code Online (Sandbox Code Playgroud)\n

编辑: \n我试图理解 CORS,这就是我现在的理解方式 - 如果我错了,请纠正我:

\n

图片仅供参考 - 地址与文本中的地址不同。

\n

跨域资源共享:

\n

1.客户端请求从以下位置获取网页 -https://localhost:5050

\n

2.客户端获取网页

\n

3.客户端尝试使用POSTGET获取\xe2\x80\x9cGET\xe2\x80\x9d数据https://localhost:5050,一切正常。

\n

4.我们有一个 API https://localhost:6060,我们希望将其与来自 - 的网页一起使用https://localhost:5050

\n

5.客户端尝试从API获取\xe2\x80\x9cGET\xe2\x80\x9d数据-https://localhost:6060

\n

6.客户端收到CORS 错误消息- 因为默认情况下只有 Origin \xe2\x80\x9c,地址 \xe2\x80\x9dhttps://localhost:6060唯一允许fetchgetpost等的地址。同一地址可以获取数据,但其他地址则无法获取数据。但是服务器上没有配置CORS ,其他API怎么可能使用这个API呢?这是因为CORS与浏览器有关,并且浏览器停止响应,因此与其他没有CORS 的API一起使用是没有问题的。

\n

7.为了允许网页访问API,需要配置服务器

\n

8.服务器需要添加Access-Control-Allow-Origin: https:/address:port 标头并返回允许的 Origin \xe2\x80\x9cAddress\xe2\x80\x9d,即发送请求的 Origin。

\n

图像1

\n

9. ASP.NET Core在Configure方法中进行配置:startup.cs

\n

In ASP net Core is configured in the startup.cs in the Configure method:

\n
     // CORS - Allow calling the API from WebBrowsers\n        app.UseCors(x => x\n            .AllowAnyMethod()\n            .AllowAnyHeader()\n            .AllowCredentials()\n            //.WithOrigins("https://localhost:44351")); // Allow only this origin can also have multiple origins seperated with comma\n            .SetIsOriginAllowed(origin => true));// Allow any origin  \n
Run Code Online (Sandbox Code Playgroud)\n
\n

10.这意味着当服务器返回响应时,它将添加Access-Control-Allow-Origin:以及允许的来源地址。

\n

11.然后浏览器将收到响应并查找Access-Control-Allow-Origin: \n如果此标头存在并且该值是发送请求的地址来源\xe2\x80\x9c网页地址\ xe2\x80\x9d。然后浏览允许响应。

\n

12.如果没有Access-Control-Allow-Origin:标头,则意味着服务器未配置CORS ,应在使用来自浏览器的API 数据之前进行配置,其他API可以GETPOST数据,但客户端不能通过浏览器

\n

图像错误

\n

13、如果响应中有Access-Control-Allow-Origin: header,但值不是当前地址,\xe2\x80\x9c网页地址\xe2\x80\x9d,则表示服务器不是针对该特定网站进行配置。

\n

地址

\n

结论: \n所以需要配置服务器才能让网站使用API ​​。这是默认的浏览器行为,将查找Access-Control-Allow-Origin:标头,如果不存在,浏览器将拒绝向客户端显示响应。如果 Access-Control-Allow-Origin: 存在,但原始值与网站地址不同,浏览器将拒绝向客户端显示响应。这意味着在任何情况下,服务器都应该配置CORS 配置,以便客户端通过 Web 浏览器访问 API。其他 API 等可以从 API 获取数据,因为它们不是 Web 浏览器,并且没有 Web浏览器 阻止响应。

\n

CORS 配置错误: \n就像@TwoFingerRightClick所说,将“允许所有来源”与“允许凭据”一起使用并不好。

\n

为什么允许凭证与允许所有来源不太好。在帖子中,他们讨论了如果CORS配置错误(就像我在上面的代码中所做的那样),用户数据将如何被窃取。我使用 Credentials 并允许所有来源,这是CORS错误配置。因此,应在没有“允许”凭据的情况下使用“允许所有来源” 。如果需要允许凭证,我们需要指定允许凭证的来源。所以我们需要使用注释行//.WithOrigins("https://localhost:44351")); // Allow only this origin can also have multiple origins separated with comma

\n

允许凭据- 允许请求和响应使用 Cookie。

\n

帖子: https ://we45.com/blog/3-ways-to-exploit-cors-misconfiguration

\n


der*_*kat 4

由于您在响应中没有获得允许跨源标头(当您的请求具有标头时),因此这并不能证明跨源仍处于启用状态。

假设跨源已禁用,为什么您仍然可以获得数据?因为 CORS 错误发生在互联网浏览器中。是浏览器阻止了访问。用 C#、Powershell 等编写的脚本仍然可以访问任何公共域中的资源,因为它是在 PC 上运行,而不是在 Internet 浏览器中运行。