Angular 6 и .NET Core 2.1; браузер не будет обмениваться файлами cookie через порты

Я не могу заставить Google Chrome отправлять файл cookie аутентификации AspNetIdentity как часть запроса при запуске моего приложения Angular 6 на другом порту, отличном от моего API. Я протестировал авторизацию, разместив приложение в уменьшенной версии на порту API (в настоящее время: 4213), и оно работает нормально. Мое приложение Angular на: 4200 получает файл 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» (я презираю магические строки).

Методы аутентификации почти полностью не имеют отношения к этой проблеме, потому что они работают просто отлично, но для любопытных их можно найти здесь.

Уборка:

Этот вопрос имеет похожий вид, но проблема в другом; Я получаю файл cookie просто отлично, но браузер не отправляет его.

У Этот вопрос есть ответ, который, кажется, подразумевает, что у меня вообще не должно быть этой проблемы, поскольку единственный задействованный домен — это localhost. Тем не менее, я.

Этот вопрос был полезен, но с тех пор я удалил свойство Lax из поля SameSite файла cookie, и у меня все еще есть та же проблема.

Иллюстрация проблемы:

Запустите приложение на :4213 через dotnet run. Перейдите к маршруту /welcome моего приложения. Нажмите войти. Меня перенаправляют на страницу входа, размещенную на том же порту. Я вхожу, все прошло успешно, меня снова перенаправляют на маршрут /welcome, но на этот раз он видит, что я вошел в систему. В моем браузере есть куки:

Angular 6 и .NET Core 2.1; браузер не будет обмениваться файлами 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. Я удаляю куки, просто для забавы (но это не имеет значения, потому что даже если я оставлю куки, это не сработает). :4200/welcome -> :4213/id/login -> :4200/welcome (зашел). Теперь у меня есть тот же файл cookie, который я только что удалил, но когда экран /welcome пытается определить, вошел ли он в систему, нажав метод авторизации (см. ссылку выше), он не будет отправлять куки!

Короче говоря, даже если я получаю файл cookie и он устанавливается, мой браузер не будет его отправлять. Я также пробовал Сафари. Основываясь на информации в других вопросах, я не понимаю, почему у меня возникла эта проблема. Любая помощь будет оценена по достоинству.

Просто чтобы быть ясным, мой вопрос:

Как я могу заставить свой браузер отправлять файл cookie, полученный через другой порт, из приложения, работающего на том же хосте, но на другом порту?

Спасибо.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
1 014
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы установили RequestOptions свойство withCredentials на true?

Если вы не установите значение true, браузер не прикрепит файл cookie к запросу.

Подробнее: RequestOptions#withCredentials

Вы, сэр, герой. Для любопытных мой запрос теперь начинается с: this.http.get(authorizeUri, { observe: 'response', withCredentials: true }) (и является наблюдаемым).

Chaim Eliyah 13.02.2019 23:19

Другие вопросы по теме