身为一个Web API,处理来自跨域不同源的请求,是一件十分合理的事情。

先上已有的文章,快速复制粘贴,启用CORS:

Microsoft:启用 ASP.NET Core 中的跨域请求 (CORS)

ASP.NET Core 配置跨域(CORS)

如果按照以上文章,一步一步操作,你会发现,虽然能跨域请求了,但是即使客户端开了(xhr.withCredentials = true)也无法将Cookie发送给API。

关于AllowAnyOrigin

  1. 这是因为请求的首部中携带了 Cookie 信息,如果 Access-Control-Allow-Origin 的值为“*”,请求将会失败。而将 Access-Control-Allow-Origin 的值设置为 http://foo.example,则请求将成功执行。

PS: 虽然API用Cookie不是很合理,但有时旧接口改造升级却不得不瞎搞,呵呵。

为什么?

先看遍原理:

阮一峰的网络日志: 跨域资源共享 CORS 详解

在来篇详细的:

MDN: HTTP访问控制(CORS)

MDN: HTTP cookies

进一步了解:

紫云飞: SameSite Cookie,防止 CSRF 攻击

跳过简单请求和预检请求不谈(不代表不重要),我们会发现一个叫SameSite的东西,是它告诉浏览器不要将Cookie发给非同源的Web API的,默认情况下,ASP.NET Core Web API 是启用的。所以配置下关闭即可。

  1. ......
  2. services.AddCors(options =>
  3. {
  4. options.AddPolicy("any", policyBuilder =>
  5. {
  6. policyBuilder.AllowAnyMethod()
  7. .AllowAnyHeader()
  8. //.WithMethods("GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "DEBUG");
  9. .AllowCredentials();//指定处理cookie
  10. var cfg = Configuration.GetSection("AllowedHosts").Get<List<string>>();
  11. if (cfg == null || cfg.Contains("*")) policyBuilder.AllowAnyOrigin(); //允许任何来源的主机访问
  12. else policyBuilder.WithOrigins(cfg.ToArray()); //允许类似http://localhost:8080等主机访问
  13. });
  14. });
  15. services.Configure<CookiePolicyOptions>(options =>
  16. {
  17. // This lambda determines whether user consent for non-essential cookies is needed for a given request.
  18. options.CheckConsentNeeded = context => true;
  19. options.MinimumSameSitePolicy = SameSiteMode.None;
  20. });
  21. .....
  22. app.UseCors("any");
  23. app.UseCookiePolicy();

  1. .....
  2. services.AddCors(options =>
  3. {
  4. options.AddPolicy("any", policyBuilder =>
  5. {
  6. policyBuilder.AllowAnyMethod()
  7. .AllowAnyHeader()
  8. //.WithMethods("GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "DEBUG");
  9. .AllowCredentials();//指定处理cookie
  10. var cfg = Configuration.GetSection("AllowedHosts").Get<List<string>>();
  11. if (cfg == null || cfg.Contains("*")) policyBuilder.AllowAnyOrigin(); //允许任何来源的主机访问
  12. else policyBuilder.WithOrigins(cfg.ToArray()); //允许类似http://localhost:8080等主机访问
  13. });
  14. });
  15. services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
  16. .AddCookie(configureOptions =>
  17. {
  18. configureOptions.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
  19. });
  20. ......
  21. app.UseCors("any");
  22. app.UseAuthentication();

参考

https://docs.microsoft.com/zh-cn/aspnet/core/security/cors

http://www.ruanyifeng.com/blog/2016/04/cors.html

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

https://www.cnblogs.com/ziyunfei/p/5637945.html

声明

本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,发表在CSDN博客园,欢迎读者转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接!请读者/爬虫们尊重版权

ASP.NET Core Web API 跨域(CORS) Cookie问题的更多相关文章

  1. asp.net core webapi之跨域(Cors)访问

    这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...

  2. 第十四节:Asp.Net Core 中的跨域解决方案(Cors、jsonp改造、chrome配置)

    一. 整体说明 1. 说在前面的话 早在前面的章节中,就详细介绍了.Net FrameWork版本下MVC和WebApi的跨域解决方案,详见:https://www.cnblogs.com/yaope ...

  3. ASP.NET Core-Docs:在 ASP.NET Core 中启用跨域请求(CORS)

    ylbtech-ASP.NET Core-Docs:在 ASP.NET Core 中启用跨域请求(CORS) 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 1. ...

  4. 或许是你应该了解的一些 ASP.NET Core Web API 使用小技巧

    一.前言 在目前的软件开发的潮流中,不管是前后端分离还是服务化改造,后端更多的是通过构建 API 接口服务从而为 web.app.desktop 等各种客户端提供业务支持,如何构建一个符合规范.容易理 ...

  5. 从ASP.Net Core Web Api模板中移除MVC Razor依赖项

    前言 :本篇文章,我将会介绍如何在不包括MVC / Razor功能和包的情况下,添加最少的依赖项到ASP.NET Core Web API项目中. 一.MVC   VS WebApi (1)在ASP. ...

  6. ASP.NET Core Web API 教程 - Project Configuration

    ASP.NET Core Web API 教程 本系列文章主要参考了<Ultimate ASP.NET Core 3 Web API>一书,我对原文进行了翻译,同时适当删减.修改了一部分内 ...

  7. 【原创】Asp.NET Core Web API与Vue 3.0搭建前后分离项目

    特地记录一下,网上的教程写的稀里糊涂的,整得我都心塞塞的,其实实现的过程蛮简单的 问题是这样的:我将Vue构建生成好的文件,放在后端wwwroot文件里面,并开启静态文件访问功能,结果总是无法显示相应 ...

  8. ASP.NET Core Web API

    1.简单介绍 ASP.NET Core Web API 是 ASP.NET Core MVC 的一个功能.ASP.NET Core MVC 包含了对 Web API 的支持.可以构建多种客户端的 HT ...

  9. ASP.NET Core Web API 最佳实践指南

    原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...

随机推荐

  1. C/C++应用程序内存泄漏检查统计方案

    一.前绪 C/C++程序给某些程序员的几大印象之一就是内存自己管理容易泄漏容易崩,笔者曾经在一个产品中使用C语言开发维护部分模块,只要产品有内存泄漏和崩溃的问题,就被甩锅“我的程序是C#开发的内存都是 ...

  2. scrapy 发post请求

    可以使用 yield scrapy.FormRequest(url, formdata, callback)方法发送POST请求. 如果希望程序执行一开始就发送POST请求,可以重写Spider类的s ...

  3. 使用GDAL实现DEM的地貌晕渲图(一)

    目录 1. 原理 1) 点法向量 2) 日照方向 (1) 太阳高度角和太阳方位角 (2) 计算过程 3) 晕渲强度 2. 实现 3. 参考 @ 1. 原理 以前一直以为对DEM的渲染就是简单的根据DE ...

  4. Java第二次作业——数组和String类

    Java第二次作业--数组和String类 学习总结 1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法.举例说明equals方法和==的区别 ...

  5. Spring Boot + Elasticsearch 实现索引的日常维护

    全文检索的应用越来越广泛,几乎成了互联网应用的标配,商品搜索.日志分析.历史数据归档等等,各种场景都会涉及到大批量的数据,在全文检索方面,方案无外乎Lucene.Solr.Elasticsearch三 ...

  6. shell的用处到底大不大

    我曾在智联招聘等网站上搜寻有关shell脚本员的职位,与C++.JAVA等热门语言相比,冷清很多.看上去似乎招shell程序员的公司比较少.是不是公司不重视或者是很少用到shell这个东东呢?     ...

  7. 用Python玩数据-笔记整理-第二章

    条件结构: if语句: if expression: #比较/成员/逻辑运算符 expr_true_suite #代码块必须缩进4个空格 else语句: if expression: expr_tru ...

  8. Sublime Text 3 实现C++代码的编译和运行

    在数据结构代码的编写中,我选用了优秀的编辑器 Sublime Text 3,但是在实现C++代码的编译和运行上费了一番周折,接下来我贴出 C++ 编译系统的代码,供各位参考. 编译后是在弹出的CMD命 ...

  9. Spring Boot2(十四):单文件上传/下载,文件批量上传

    文件上传和下载在项目中经常用到,这里主要学习SpringBoot完成单个文件上传/下载,批量文件上传的场景应用.结合mysql数据库.jpa数据层操作.thymeleaf页面模板. 一.准备 添加ma ...

  10. nginx 的信号量

    参考文章:https://blog.51cto.com/5660061/2380428 nginx 中的信号量: TERM,INT  快速的结束应用程序 ,等同于 kill -9 pid QUIT 优 ...