版本:.net core 3.1
由于WebAPI返回的json都是小写的,并且项目用的NewtonsoftJson
=========================Json格式返回大写开头============================
services.AddControllersWithViews().AddNewtonsoftJson(options =>
{
//使用默认的解析类
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});
services.AddMvc().AddJsonOptions(o =>
{
//将默认的策略设置为null
o.JsonSerializerOptions.PropertyNamingPolicy = null;
o.JsonSerializerOptions.DictionaryKeyPolicy = null;
});
====================================================================
之后发现在用到Session的时候发现设置Session老是取不到,客户端每次请求的SessionId都是不一样的(之前是没问题的),首先是想到了跨域的问题
==========================跨域SessionId不一致==========================
后端:
services.AddCors(confg =>
{
//AllowCredentials() 是禁止 AllowAnyOrigin()的,需要指定Origin
confg.AddPolicy(Constants.VueCors, p =>
p.AllowCredentials().AllowAnyMethod().AllowAnyHeader()
.WithOrigins("http://localhost:8083")
);
});
app.UseCors(Constants.VueCors);
前端:
axios.defaults.withCredentials = true;
======================================================================
设置完跨域后SessionId还是不一致,查看了Request和Response,发现在Response中SetCookie的信息后面有个叹号:此Set-Cookie被阻止,因为它具有“ SameSite = Lax”属性,但来自跨站点响应,而不是对顶级导航的响应.
这是在.net core设置防跨站脚本攻击时会有的设置,但是我没添加过,后面查资料发现这是由于我前面改Json返回格式时调用了AddMvc(),这个方法中调用到了AddAntiforgery(),那么需要给Cookie设置SameSite
==========================设置Cookie SameSite===========================
services.AddSession(options =>
{
options.Cookie.Name = "MyID.Session";
options.IdleTimeout = System.TimeSpan.FromSeconds(120);
options.Cookie.IsEssential = true;
options.Cookie.HttpOnly = true;
options.Cookie.SameSite = SameSiteMode.None;
//这条也是必须的,SameSiteMode.None时必须设置
options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
});
======================================================================