ASP.NET Core Web API 跨域(CORS) Cookie问题
2019-08-07 21:50
1746 查看
身为一个Web API,处理来自跨域不同源的请求,是一件十分合理的事情。
先上已有的文章,快速复制粘贴,启用CORS:
Microsoft:启用 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不是很合理,但有时旧接口改造升级却不得不瞎搞,呵呵。
为什么?
先看遍原理:
在来篇详细的:
进一步了解:
紫云飞: 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();
参考
https://docs.microsoft.com/zh-cn/aspnet/core/security/cors
https://www.geek-share.com/detail/2750843660.html
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
https://www.geek-share.com/detail/2679325580.html
声明
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,发表在CSDN和博客园,欢迎读者转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接!请读者/爬虫们尊重
版权
相关文章推荐
- asp.net core webapi之跨域(Cors)访问
- ASP.NET Core WebApi 跨域配置 Cors
- 在dotnet core web api中支持CORS(跨域访问)
- Asp.Net Core WebAPI入门整理(三)跨域处理
- 问题:调用 ASP.Net Core WebAPI的HTTP POST方法时,从 [FromBody] 中读取的 MongoDB GeoJsonObjectModel成员总是null
- asp.net core webapi 似乎未安装在 IIS 中承载 .NET Core 项目所需的 AspNetCoreModule。请尝试修复 Visual Studio 以纠正该问题。
- asp.net core api跨域问题
- Asp.net Core WebApi 返回JSON自动驼峰格式化问题
- asp.net core 创建允许跨域请求的api, cors.
- ASP.NET Core Web Api之JWT VS Session VS Cookie(二)
- IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
- ASP.NET CORE WEB API DEMO 02
- 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线
- asp.net(C#)跨域及跨域写Cookie问题
- c# WebApi之解决跨域问题:Cors
- Asp.net Core WebApi--(1)环境搭建
- ASP.NET Core Web API + Angular 仿B站(二)后台模型创建以及数据库的初始化
- ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线
- ASP.NET Core MVC/WebApi基础系列2
- ASP.NET WebAPI String 传值问题