环境为.netcore 3.1
.netcore webapi 一般涉及到跨域和Session问题, 要使用就得先配置,首先得配置跨域和开启Session。
在Startup中的ConfigureServices里增加:
services.AddSession();
services.AddCors(options =>
{
options.AddPolicy("cors", builder =>
{
//AllowAnyOrigin已禁止使用了
builder.AllowAnyOrigin().WithOrigins("*", "http://localhost:8080")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();//指定处理cookie
});
});
//AllowAnyOrigin已禁止使用了,所以需要直接配置访问域名WithOrigins("*", "http://localhost:8080")
在Configure里增加:
app.UseCors("cors");
app.UseSession();
app.UseCors("cors");这里使用了上面配置的名称“cors”,全局注册。
这样就配置完成了。
直接从浏览器使用接口地址请求,服务端拿到的SessionId始终是一致的,没什么问题。
但如果从web上跨域请求,比如使用vue前后端分离请求接口,那么就会产生同一浏览器SessionId不一致问题。
解决方案:
服务端在配置跨域的时候增加
.AllowCredentials();
在ajax请求中设置发送cookie信息:
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
如果是vue:
const instance = axios.create({
withCredentials: true
});
这样,服务端拿到的SessionId就一致了。
非跨域情况下,这个参数无效的,因为在默认情况下,跨源请求不提供凭据(cookie、HTTP认证及客户端SSL证明等)。通过将withCredentials属性设置为true,可以指定某个请求应该发送凭据。如果服务器接收带凭据的请求,会用下面的HTTP头部来响应。
虽然设置了widthCredentials为true的请求中会包含远程域的所有cookie,但这些cookie仍然遵循同源策略,所以外域是访问不了这些cookie的,现在我们就可以安全地跨域访问啦