我们需要在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"."
}
答案 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。
示例 - 从 JS fetch api 访问:
在JS APP中: - fetch api:
mode: 'cors',
credentials: 'include'
编辑: 我试图理解 CORS,这就是我现在的理解 - 如果我错了,请纠正我:
图片仅供参考,地址与文中不同。
CORS:
1. 客户端请求从 - https://localhost:5050
2.客户端获取网页
3.客户端尝试使用POST或GET从https://localhost:5050
获取“GET”数据strong>,一切都很好。
4.我们在 https://localhost:6060
有一个 API,我们希望将它与来自 - https://localhost:5050
5. 客户端尝试从 API 获取 “GET” 数据 - https://localhost:6060
6. 客户端获取 CORS 错误消息 - 因为默认情况下只有源“地址”https://localhost:6060
是唯一允许 >fetch、get、post 等。像swagger 等在同一个地址上可以获取数据,但其他<强>地址不能。但是,其他API 怎么可能在服务器上没有CORS 配置的情况下使用这个API。这是因为 CORS 与 浏览器 及其停止响应的浏览器相关,因此将其与其他 API 一起使用,而无需 CORS 没问题。
7.要允许网页访问 API,需要为此配置的服务器。
8. 服务器需要添加一个 Access-Control-Allow-Origin: https:/address:port
标头并返回允许的源“地址”,即发送请求的一个。
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 可以GET 和 POST 数据,但客户端通过浏览器 不能。
13.如果有 Access-Control-Allow-Origin: 标头和响应但值不是当前地址,“web页面地址”,则表示该服务器未针对该特定网站进行配置。
结论: 因此,需要配置服务器才能使网站使用 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浏览器中运行。