身为一个 web API, 处理来自跨域不同源的请求, 是一件十分合理的事情.
先上已有的文章, 快速复制粘贴, 启用 CORS:
Microsoft: 启用 ASP.NET Core 中的跨域请求 (CORS)
ASP.NET Core 配置跨域(CORS)
如果按照以上文章, 一步一步操作, 你会发现, 虽然能跨域请求了, 但是即使客户端开了 (xhr.withCredentials = true) 也无法将 Cookie 发送给 API.
关于 AllowAnyOrigin
这是因为请求的首部中携带了 Cookie 信息, 如果 Access-Control-Allow-Origin 的值为 "*", 请求将会失败. 而将 Access-Control-Allow-Origin 的值设置为 http://foo.example, 则请求将成功执行.
PS: 虽然 API 用 Cookie 不是很合理, 但有时旧接口改造升级却不得不瞎搞, 呵呵.
为什么?
先看遍原理:
阮一峰的网络日志: 跨域资源共享 CORS 详解 http://www.ruanyifeng.com/blog/2016/04/cors.html
在来篇详细的:
MDN: HTTP 访问控制(CORS)
MDN: HTTP cookies
进一步了解:
紫云飞: SameSite Cookie, 防止 CSRF 攻击
跳过简单请求和预检请求不谈(不代表不重要), 我们会发现一个叫 SameSite 的东西, 是它告诉浏览器不要将 Cookie 发给非同源的 Web API 的, 默认情况下, ASP.NET Core Web API 是启用的. 所以配置下关闭即可.
- ......
- services.AddCors(options =>
- {
- options.AddPolicy("any", policyBuilder =>
- {
- policyBuilder.AllowAnyMethod()
- .AllowAnyHeader()
- //.WithMethods("GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "DEBUG");
- .AllowCredentials();// 指定处理 cookie
- var cfg = Configuration.GetSection("AllowedHosts").Get<List<string>>();
- if (cfg == null || cfg.Contains("*")) policyBuilder.AllowAnyOrigin(); // 允许任何来源的主机访问
- else policyBuilder.WithOrigins(cfg.ToArray()); // 允许类似 http://localhost:8080 等主机访问
- });
- });
- services.Configure<CookiePolicyOptions>(options =>
- {
- // This lambda determines whether user consent for non-essential cookies is needed for a given request.
- options.CheckConsentNeeded = context => true;
- options.MinimumSameSitePolicy = SameSiteMode.None;
- });
- .....
- App.UseCors("any");
- App.UseCookiePolicy();
或
- .....
- services.AddCors(options =>
- {
- options.AddPolicy("any", policyBuilder =>
- {
- policyBuilder.AllowAnyMethod()
- .AllowAnyHeader()
- //.WithMethods("GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "DEBUG");
- .AllowCredentials();// 指定处理 cookie
- var cfg = Configuration.GetSection("AllowedHosts").Get<List<string>>();
- if (cfg == null || cfg.Contains("*")) policyBuilder.AllowAnyOrigin(); // 允许任何来源的主机访问
- else policyBuilder.WithOrigins(cfg.ToArray()); // 允许类似 http://localhost:8080 等主机访问
- });
- });
- services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
- .AddCookie(configureOptions =>
- {
- configureOptions.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
- });
- ......
- App.UseCors("any");
- App.UseAuthentication();
参考
- http://www.ruanyifeng.com/blog/2016/04/cors.html
- https://www.cnblogs.com/ziyunfei/p/5637945.html
声明
本文采用知识共享署名 - 非商业性使用 - 相同方式共享 2.5 中国大陆许可协议进行许可, 发表在 CSDN https://blog.csdn.net/hatmen2 和博客园, 欢迎读者转载, 但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文连接! 请读者 / 爬虫们尊重版权
来源: https://www.cnblogs.com/chasingdreams2017/p/11318083.html