跨域 CROS
大约 2 分钟
跨域 CROS
参考资料
- https://learn.microsoft.com/zh-cn/aspnet/core/security/cors?view=aspnetcore-5.0#preflight-requests
概念
什么是跨域:请求 url 的协议、域名、端口三者之间任意一个与当前页面 url 不同即为跨域
[协议]://[域名]:[端口]
ASP.NET Core 中解决跨域的 3 种方案
- [DisableCors] 特性可以禁用跨域
- [DisableCors] 特性不会禁用终结点路由已使用
RequireCors
启用的 CORS。
使用终结点路由 :
RequireCors()
按终结点启用 CORS 不支持自动预检请求
endpoints.MapGet("/echo", context => context.Response.WriteAsync("echo")) .RequireCors(MyAllowSpecificOrigins);
使用 [EnableCors] 特性 :
[EnableCors("{Policy String}")]
- 可将不同的策略应用于具有
[EnableCors]
特性的控制器、页面模型或操作方法 - 同时使用特性和中间件时,将同时应用两种策略,建议不要合并策略。
- 可将不同的策略应用于具有
使用步骤:
配置跨域策略
services.AddCors(options)
添加中间件
app.UseCors([策略名称])
配置跨域策略
默认策略和命名策略
默认策略
AddDefaultPolicy
services.AddCors(options => options.AddDefaultPolicy(policy =>policy.WithOrigins("http://example.com")));
命名策略
AddPolicy
services.AddCors(options => options.AddPolicy(name: MyAllowSpecificOrigins, policy => policy.WithOrigins("http://example.com")));
策略选项
当请求无法匹配策略是,应用返回 200 OK 响应,但不发回 CORS 头,浏览器不会跨源请求
设置允许的源 :
AllowAnyOrigin
|WithOrigins
设置允许的 HTTP 方法 :
AllowAnyMethod
|WithMethods
设置允许的请求头 :
AllowAnyHeader
|WithHeaders
设置公开的响应头 :
WithExposedHeaders
跨源请求中的凭据 :
AllowAnyCredential
|AllowCredentials
- 同时指定
AllowAnyOrigin
和AllowCredentials
可能导致跨网站请求伪造,同时指定时CORS 服务会返回无效的 CORS 响应。 - 如果浏览器发送凭据,但响应不包含有效的
Access-Control-Allow-Credentials
头,则浏览器不会向应用公开响应,而且跨源请求会失败。
- 同时指定
添加中间件
- 中间件需要按照中间件顺序添加到恰当位置,详见中间件笔记