Vite+Axios+ASP.NET Core WebApi跨域请求携带Cookie失败

问题重现

从页面地址发送请求到服务器接口,跨域没有问题,调用接口也正常,返回Cookie也正常,但是在后续接口没有自动带上Cookie。

服务器接口地址:https://127.0.0.1:65001

页面地址:https://localhost:3000

使用的浏览器Microsoft Edge version.92

首先、设置跨域请求携带Cookie

此部分需要分为两部分,服务端和客户端

服务端

需要为请求响应设置响应头access-control-allow-credential: true

具体在ASP.NET Core里的操作则对应如下代码。

在Startup.cs中设置如下

services.AddCors(setup =>
{
    setup.AddPolicy(DefaultCorsPolicyName, config =>
    {
        config.WithOrigins(allowedOrigins.ToArray())
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials();
    });
});

在其他语言框架中可能实现方式不同

客户端

在axios中设置允许携带Cookie

可以使用拦截器在每个请求上设置,也可以直接修改设置

axios.defaults.withCredentials = true;
axios.interceptors.request.use(
    (config) => {
        config.withCredentials = true; // 允许携带cookie
        return config;
    }
);

经过如上设置后能正常跨域请求,但是后续接口无法自动携带Cookie,导致服务器身份认证失败。

问题原因 

经过反复排查,最后确认问题出现在请求头Sec-Fetch-Site上,当Sec-Fetch-Site的值为cross-site时,则不携带Cookie;当值为same-site时,则可以携带Cookie。

参考资料:Sec-Fetch-*请求头,了解下? - 福禄网络研发团队 - 博客园 (cnblogs.com)

解决

服务器和客户端的地址都是用相同的IP地址,问题解决。

 

posted @ 2021-08-15 20:13  Watt不想上班  阅读(609)  评论(0编辑  收藏  举报