【问题标题】:Angular 6 and .NET Core 2.1; browser won't share cookies across portsAngular 6 和 .NET Core 2.1;浏览器不会跨端口共享 cookie
【发布时间】:2019-07-07 20:50:37
【问题描述】:

在与我的 API 不同的端口上运行我的 Angular 6 应用程序时,我无法让 Google Chrome 将 AspNetIdentity 身份验证 cookie 作为请求的一部分发送。我已经通过在 API 端口(当前:4213)上以缩小版本托管应用程序来测试身份验证,它工作得很好。我在 :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:

...在对服务器的后续请求中,会自动发送该 cookie。

好的;所以,我打开一个新终端并运行

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

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

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

为了清楚起见,我的问题是:

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

谢谢。

【问题讨论】:

    标签: angular cookies .net-core


    【解决方案1】:

    您是否在RequestOptions 中设置了withCredentials 属性true

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

    更多详情:RequestOptions#withCredentials

    【讨论】:

    • 您,先生,是个英雄。出于好奇,我的请求现在开始于:this.http.get(authorizeUri, { observe: 'response', withCredentials: true })(并且是可观察的)。
    猜你喜欢
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2023-03-06
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多