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中:
\nservices.AddCors();\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n安装 NuGet 包: Microsoft.AspNetCore.Cors
\n<PackageReference Include="Microsoft.AspNetCore.Cors" Version="2.2.0" />\nRun Code Online (Sandbox Code Playgroud)\n现在可以使用 ex 从浏览器调用 api。JavaScript。
\n\n示例 - 从 JS fetch api 访问:
\n在JS APP中: - 获取api:
\nmode: \'cors\', \ncredentials: \'include\' \nRun Code Online (Sandbox Code Playgroud)\n编辑: \n我试图理解 CORS,这就是我现在的理解方式 - 如果我错了,请纠正我:
\n图片仅供参考 - 地址与文本中的地址不同。
\n跨域资源共享:
\n1.客户端请求从以下位置获取网页 -https://localhost:5050
2.客户端获取网页
\n3.客户端尝试使用POST或GET获取\xe2\x80\x9cGET\xe2\x80\x9d数据https://localhost:5050,一切正常。
4.我们有一个 API https://localhost:6060,我们希望将其与来自 - 的网页一起使用https://localhost:5050
5.客户端尝试从API获取\xe2\x80\x9cGET\xe2\x80\x9d数据-https://localhost:6060
6.客户端收到CORS 错误消息- 因为默认情况下只有 Origin \xe2\x80\x9c,地址 \xe2\x80\x9d是https://localhost:6060唯一允许fetch、get、post等的地址。同一地址可以获取数据,但其他地址则无法获取数据。但是服务器上没有配置CORS ,其他API怎么可能使用这个API呢?这是因为CORS与浏览器有关,并且浏览器停止响应,因此与其他没有CORS 的API一起使用是没有问题的。
7.为了允许网页访问API,需要配置服务器。
\n8.服务器需要添加Access-Control-Allow-Origin: https:/address:port 标头并返回允许的 Origin \xe2\x80\x9cAddress\xe2\x80\x9d,即发送请求的 Origin。
9. ASP.NET Core在Configure方法中进行配置:startup.cs
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\n10.这意味着当服务器返回响应时,它将添加Access-Control-Allow-Origin:以及允许的来源地址。
\n11.然后浏览器将收到响应并查找Access-Control-Allow-Origin: \n如果此标头存在并且该值是发送请求的地址的来源\xe2\x80\x9c网页地址\ xe2\x80\x9d。然后浏览器允许响应。
\n12.如果没有Access-Control-Allow-Origin:标头,则意味着服务器未配置CORS ,应在使用来自浏览器的API 数据之前进行配置,其他API可以GET和POST数据,但客户端不能通过浏览器。
\n\n13、如果响应中有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浏览器 阻止响应。
\nCORS 配置错误: \n就像@TwoFingerRightClick所说,将“允许所有来源”与“允许凭据”一起使用并不好。
\n为什么允许凭证与允许所有来源不太好。在帖子中,他们讨论了如果CORS配置错误(就像我在上面的代码中所做的那样),用户数据将如何被窃取。我使用 Credentials 并允许所有来源,这是CORS的错误配置。因此,应在没有“允许”凭据的情况下使用“允许所有来源” 。如果需要允许凭证,我们需要指定允许凭证的来源。所以我们需要使用注释行//.WithOrigins("https://localhost:44351")); // Allow only this origin can also have multiple origins separated with comma
允许凭据- 允许请求和响应使用 Cookie。
\n帖子: https ://we45.com/blog/3-ways-to-exploit-cors-misconfiguration
\n由于您在响应中没有获得允许跨源标头(当您的请求具有标头时),因此这并不能证明跨源仍处于启用状态。
假设跨源已禁用,为什么您仍然可以获得数据?因为 CORS 错误发生在互联网浏览器中。是浏览器阻止了访问。用 C#、Powershell 等编写的脚本仍然可以访问任何公共域中的资源,因为它是在 PC 上运行,而不是在 Internet 浏览器中运行。
| 归档时间: |
|
| 查看次数: |
36032 次 |
| 最近记录: |