Angular 6和.NET Core 2.1;浏览器不会跨端口共享Cookie

时间:2019-02-13 21:55:08

标签: angular cookies .net-core

在与API不同的端口上运行Angular 6应用程序时,我无法让Google Chrome发送AspNetIdentity身份验证cookie作为请求的一部分。我已经通过将应用程序托管在API端口(当前为:4213)上的缩小版本中来测试auth,并且工作正常。我在:4200上的Angular应用收到了cookie;在F12 DevTools中可见;它不会将它作为GET请求的一部分发送。

我管道的相关部分:

    public void ConfigureServices(IServiceCollection services)
    {   
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme);
        //skipping Identity stuff, but it's there
        services.ConfigureApplicationCookie(options =>
        {
            //options.IdleTimeout = TimeSpan.FromSeconds(10); // for testing only
            options.Cookie.HttpOnly = true; // prevent JavaScript access
            options.Cookie.Expiration = TimeSpan.FromDays(150); // half a year?
            options.Cookie.SameSite = SameSiteMode.None;
        }

        services.AddCors(options => {
            options.AddPolicy(StartupConfiguration.AllowCredentials, builder => {
                builder.WithOrigins("https://localhost:4213", "https://localhost:4200")
                       .AllowAnyHeader()
                       .AllowAnyMethod()
                       .AllowCredentials();
            });
        });
    }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseCors(StartupConfiguration.AllowCredentials);
        app.UseCookiePolicy(new CookiePolicyOptions {
            MinimumSameSitePolicy = SameSiteMode.None
        });
        // Again, skipping ASP.NET Identity configuration, but it's there.
    }

StartupConfiguration.AllowCredentials只是一个静态字段,它返回字符串“ AllowCredentials”(我鄙视魔术字符串)。

身份验证方法几乎完全与此问题无关,因为它们可以正常工作,但出于好奇,they can be found here

客房整理:

This question具有相似的外观,但是问题有所不同;我得到的cookie很好,但是浏览器没有发送它。

This question的答案似乎暗示我根本不应该遇到此问题,因为涉及的唯一域是localhost。不过,我是。

This question是有帮助的,但是此后我从Cookie的SameSite字段中删除了Lax属性,但我仍然遇到相同的问题。

问题的说明:

通过dotnet run在:4213上启动应用。导航到我的应用的/welcome路线。单击登录。我被重定向到同一端口上托管的登录页面。我登录成功,再次重定向到/welcome路由,但是这次它看到我已登录。浏览器中有一个cookie:

Success

...以及随后向服务器发送的请求,该cookie会自动发送。

好吧;所以,我打开一个新终端,然后运行

ng serve --host 0.0.0.0 --ssl true --ssl-key ./ssl/server.key --ssl-cert ./ssl/server.crt --configuration local-dev

...这将以相同的代码启动相同的应用程序,并使用与.NET Core应用程序相同的协议通过:4200浏览。我删除了cookie,只是为了踢(但没关系,因为即使保留cookie,它也不起作用)。 :4200/welcome-> :4213/id/login-> :4200/welcome(已登录)。现在,我有我刚刚删除的cookie ,但是当/welcome屏幕尝试通过单击Authorize方法(请参见上面的链接)来确定它是否已登录时, it不会发送Cookie

简而言之,即使我正在接收cookie并进行了设置,我的浏览器也不会发送它。我也尝试过Safari。根据其他问题的信息,我不明白为什么会遇到此问题。任何帮助将不胜感激。

请明确,我的问题是:

如何让我的浏览器发送通过同一端口但在另一个端口上运行的应用程序通过另一个端口接收的cookie?

谢谢。

1 个答案:

答案 0 :(得分:1)

您是否在RequestOptions的{​​{1}}属性中设置了withCredentials

如果未设置为true,则浏览器不会在请求中附加cookie。

更多详细信息:RequestOptions#withCredentials