【问题标题】:How to disable CORS completely in WebAPI如何在 WebAPI 中完全禁用 CORS
【发布时间】:2018-06-25 09:46:29
【问题描述】:

我们需要在 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"."
}

【问题讨论】:

  • 当您运行此命令时,您是否在响应中获得允许跨源标头?如果不是,则不允许使用 CORS。
  • 我已添加回复

标签: asp.net-web-api cors


【解决方案1】:

这适用于我在 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中:-获取api:

mode: 'cors', 
credentials: 'include'  

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

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

CORS:

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

2.客户端获取网页

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

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

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

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

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

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

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: 如果有这个header并且值是发送请求“网页地址”的地址origin强>。然后响应被 浏览器允许

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

13.如果响应中有Access-Control-Allow-Origin:标头但值不是当前地址,“web页面地址” 那么这意味着服务器没有为这个特定的网站配置。

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

CORS 配置错误: 正如 @TwoFingerRightClick 所说,Allow All Origins 和 Allow Credentials 一起使用并不好。

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

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

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

【讨论】:

  • Using .SetIsOriginAllowed(origin =&gt; true).AllowAnyOrgin()* 允许使用 AllowCredentials(),因此您不必担心此规则:“'Access-Control-Allow-Credentials' 标头的值在响应中是 '',当请求的凭据模式为 'include' 时,它必须为 'true'。”现在您获得了最不安全的网站(不要像 Steam 那样将其发布给 Prod,然后用户的会话就会被盗)! *.AllowAnyOrgin() 不能与 AllowCredentials() 结合使用
  • 绝妙的答案!多年来,我一直在搞这个 cors 废话,关注你的帖子让它对我有用。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 2017-11-25
    • 2020-02-02
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多