如何在WebAPI中完全禁用CORS

时间:2018-01-16 16:07:34

标签: asp.net-web-api cors

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

        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

通过thread,发送以下请求

curl -H "Origin: http://www.google.com" --verbose \ http://localhost:23422/api/values

响应

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

它确实起作用并且返回实际结果。这是否仍然支持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

响应

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"."
}

2 个答案:

答案 0 :(得分:3)

这在 ASP Net Core 中对我有用:

我遇到了类似的问题。

在 startup.cs - ConfigureServices 中:

services.AddCors();

在 startup.cs - 配置:

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

安装 NuGet 包: Microsoft.AspNetCore.Cors

<PackageReference Include="Microsoft.AspNetCore.Cors" Version="2.2.0" />

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

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

示例 - 从 JS fetch api 访问:

在JS APP中: - fetch api:

mode: 'cors', 
credentials: 'include'  

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

图片仅供参考,地址与文中不同。

CORS:

1. 客户端请求从 - https://localhost:5050

获取网页

2.客户端获取网页

3.客户端尝试使用POSTGEThttps://localhost:5050获取“GET”数据strong>,一切都很好。

4.我们在 https://localhost:6060 有一个 API,我们希望将它与来自 - https://localhost:5050

的网页一起使用

5. 客户端尝试从 API 获取 “GET” 数据 - https://localhost:6060

6. 客户端获取 CORS 错误消息 - 因为默认情况下只有源“地址”https://localhost:6060 是唯一允许 >fetchgetpost 等。像swagger 等在同一个地址上可以获取数据,但其他<强>地址不能。但是,其他API 怎么可能在服务器上没有CORS 配置的情况下使用这个API。这是因为 CORS浏览器 及其停止响应的浏览器相关,因此将其与其他 API 一起使用,而无需 CORS 没问题。

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

8. 服务器需要添加一个 Access-Control-Allow-Origin: https:/address:port 标头并返回允许的源“地址”,即发送请求的一个。

img1

9. ASP net Core在Configure方法的startup.cs配置

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

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

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

11.浏览器会得到响应并寻找Access-Control-Allow-Origin: 如果此标头存在并且值是发送请求的地址来源“网页地址”强>。然后响应被浏览器允许

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

imgerror

13.如果有 Access-Control-Allow-Origin: 标头和响应但值不是当前地址,“web页面地址”,则表示该服务器未针对该特定网站进行配置。

address

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

CORS 配置错误: 就像 @TwoFingerRightClick 所说的那样,将 Allow All Origins 与 Allow Credentials 一起使用是不好的。

为什么允许凭据与允许所有来源不太好。在帖子中,他们讨论了如果 CORS 像我在上面的代码中所做的那样错误配置,用户数据将如何被盗。我使用凭据并允许 CORS错误配置的所有来源。所以 allow all origins 应该在没有 Allow 凭据的情况下使用。如果需要允许凭据,我们需要指定我们允许凭据的来源。所以我们需要使用注释行 // CORS - Allow calling the API from WebBrowsers app.UseCors(x => x .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials() //.WithOrigins("https://localhost:44351")); // Allow only this origin can also have multiple origins seperated with comma .SetIsOriginAllowed(origin => true));// Allow any origin

允许凭据 - 允许带有请求和响应的 Cookie。

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

答案 1 :(得分:1)

由于您没有在响应中获得允许跨越原始标头(当您的请求具有标头时),这不能证明仍然启用了跨源。

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