Я не могу заставить 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, но на этот раз он видит, что я вошел в систему. В моем браузере есть куки:
... и при последующих запросах к серверу этот файл 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, полученный через другой порт, из приложения, работающего на том же хосте, но на другом порту?
Спасибо.





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