aps.net core2.1 webapi 跨域请求后session(cookie)失效的问题

Breezexiang 2019-02-28 08:37:52
public void ConfigureServices(IServiceCollection services)
{
//依赖注入
services.AddOptions();

//禁用 dotnet core 2.1的formbody等模式自动校验和转换
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});

//跨域
services.AddCors();

// session 设置
services.AddSession(options =>
{
// 设置 Session 过期时间
options.IdleTimeout = TimeSpan.FromHours(2);

//js无法获得cookie ,防XSS攻击
options.Cookie.HttpOnly = true;
});

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}


public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}

//强制指定http跳转到https
//app.UseHttpsRedirection();

// 必须在 UseMvc 之前调用
app.UseSession();

app.UseStaticFiles();

//跨域
app.UseCors(builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials()
);

app.UseMvc();
}


上面是Startup.cs里的代码,然后在controller的action里这样设置了session
if (!HttpContext.Session.TryGetValue("token", out a))
HttpContext.Session.SetString("token", Guid.NewGuid().ToString().Substring(0, 6));
string ss = "hello .net core " + "Session:" + HttpContext.Session.GetString("token") + " " + DateTime.Now.ToString("MM-dd HH:mm:ss");


然后在浏览器中使用,不断的访问这个action,是可以设置session和拿到session。但是当这个接口被跨域调用后,只能拿到数据,每次的session都不一样。仔细看了chrome中,发现单独访问接口时,有.AspNetCore.Session 的cookie。但是作为接口被跨域调用后,没有cookie。

所以如果解决跨域后,能拿到数据,但是无法维持会话无法拿到cookie的这个问题啊




...全文
805 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 5 楼 Breezexiang 的回复:
,如果我们能通过解决问题来降低开发成本就最好了,如果不行那么只好用现在流行的方案解决现在的问题
有些是小节,有些是变革。许多小节看似高大上,其实长期看没啥必要。比如说世界上那么多伟大的盛世王朝,其实往往就是通过杀人——让人口急剧减少——来提高人均生产力的,仅仅有不到5次几次世界级的技术革命变了世界,其它的人类改变其实主要是靠政治手腕而技术变革的效果并不突出。 从所谓“通过解决问题来降低开发成本”演进到“用现行的流行方案解决现在的问题”是一个重大的技术变革,是放弃什么 asp.net 页面编程的概念,而真正采用前端技术优先的战略,从此也就不纠结什么 asp.net、php、jsp 或者别的服务器端编程语言。
  • 打赏
  • 举报
回复
引用 5 楼 Breezexiang 的回复:
开发成本包括鉴权部分代码重构,缓存部分代码重构,前后端开发人员培训,额外搭建redis服务器这些在我看来可能比起解决这个难点来说不划算一些
前端开发为主。因此不应该纠结 asp.net 服务器端给你产生和动态维系的客户端 session id。 所谓的 asp.net 的一遍遍刷新页面的服务器端编程中的所谓 session 机制,你脑子中现在还以这个为主。
  • 打赏
  • 举报
回复
引用 3 楼 Breezexiang 的回复:
一开始是把页面分离,接口只服务于本站点的页面。然后现在又加了微信h5端,所以想复用这部分功能代码
你按照“接口”的规范去设计就可以了,不要把让接口去适应页面,而应该让页面去使用接口。在页面上使用接口时,就应该按照接口规范,你原来在接口中纠结 asp.net 的 独特的 session机制这本来就是 asp.net 的问题。
正怒月神 版主 2019-03-01
  • 打赏
  • 举报
回复
引用 5 楼 Breezexiang 的回复:
[quote=引用 4 楼 正怒月神 的回复:] 对于这种问题, 我认为用redis缓存,比session更加靠谱。
如果通过代码无法重用session(cookie)机制的话,那么就只好退而求其次的用token+缓存的机制来实现 其实在我看来这并不是靠谱不靠谱的事,.net+iis 的session靠谱程度上肯定没问题,只是这样的机制不适用当前时代的项目需求,如果我们能通过解决问题来降低开发成本就最好了,如果不行那么只好用现在流行的方案解决现在的问题 ps: 开发成本包括鉴权部分代码重构,缓存部分代码重构,前后端开发人员培训,额外搭建redis服务器这些在我看来可能比起解决这个难点来说不划算一些[/quote] 如果说在现有项目基础上,不希望拓展的话,那么只能解决跨域时,保存cookie的session,其实这个问题,好像不是特别困难的。
Breezexiang 2019-03-01
  • 打赏
  • 举报
回复
引用 4 楼 正怒月神 的回复:
对于这种问题, 我认为用redis缓存,比session更加靠谱。
如果通过代码无法重用session(cookie)机制的话,那么就只好退而求其次的用token+缓存的机制来实现 其实在我看来这并不是靠谱不靠谱的事,.net+iis 的session靠谱程度上肯定没问题,只是这样的机制不适用当前时代的项目需求,如果我们能通过解决问题来降低开发成本就最好了,如果不行那么只好用现在流行的方案解决现在的问题 ps: 开发成本包括鉴权部分代码重构,缓存部分代码重构,前后端开发人员培训,额外搭建redis服务器这些在我看来可能比起解决这个难点来说不划算一些
正怒月神 版主 2019-03-01
  • 打赏
  • 举报
回复
对于这种问题, 我认为用redis缓存,比session更加靠谱。
Breezexiang 2019-02-28
  • 打赏
  • 举报
回复
引用 2 楼 q363186 的回复:
webapi 用Session 表示费解, 跨域请求 浏览器不会帮你提交COOKIE 的
一开始是把页面分离,接口只服务于本站点的页面。然后现在又加了微信h5端,所以想复用这部分功能代码
楠小南 2019-02-28
  • 打赏
  • 举报
回复
webapi 用Session 表示费解, 跨域请求 浏览器不会帮你提交COOKIE 的
Breezexiang 2019-02-28
  • 打赏
  • 举报
回复
对了,js的代码如下
function gohealthcheck() {
            $.ajax({
                url:"http://www.abc.cn/api",
                data: {},
                type: "get",
                dataType: "json",
                xhrFields: {
                    withCredentials: true
                },
                crossDomain: true,
                success: function (json) {
                    $("#txt").append(json.data + '</br>');
                }
            });
        }
查了很多资料,已经加了 xhrFields: { withCredentials: true }, crossDomain: true,

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧