#c# #.net #iis #cookies
Вопрос:
это мой сценарий: у меня есть приложение веб-API .Net5 и приложение React, которое вызывает его API. Процесс аутентификации выполняется с использованием файлов cookie.
Эти строки заданы в моем файле Startup.cs:
public void ConfigureServices(IServiceCollection services) { ... services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(_ =gt; { _.Cookie.Name = "_auth"; }); ... }
Метод контроллера, используемый API входа в систему, является
[HttpPost("Login")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [SwaggerOperation(Summary = "Login user")] public async Tasklt;ActionResultlt;stringgt;gt; Login([FromBody] UserLogin request, [FromQuery] string returnUrl) { returnUrl = await this.accountData.LoginAsync(request, returnUrl, HttpContext); return Ok(new SuccessResultlt;stringgt;(returnUrl, true)); }
И метод, который выполняет действие входа в систему, является
private Task PerformSignIn(Listlt;Claimgt; claims, AuthenticationProperties authenticationProperties, HttpContext httpContext) { string authenticationScheme = this.GetAuthenticationScheme(); ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims, authenticationScheme, USER_CLAIM, null); return httpContext.SignInAsync(authenticationScheme, new ClaimsPrincipal(claimsIdentity), authenticationProperties); }
Итак, когда я использую локальную версию своего серверного приложения, размещенного либо в IIS Express, либо в Docker, действие входа в систему работает как заклинание, внешнее приложение вызывает API, который возвращает 200, и при этом файлы cookie _auth сохраняются в браузере.
Проблема
Затем я разместил серверное приложение на тестовом сервере IIS с помощью папки «Опубликовать через». Это приложение находится на веб-сайте и использует выделенный пул приложений. Я изменил конечную точку, используемую внешним приложением, чтобы она работала с помощью размещенного приложения IIS, оно использует протокол http. Вызывается логин, и он возвращает 200 с правильной полезной нагрузкой, но файл cookie _auth не установлен, и последующие вызовы завершаются ошибкой с ответом 401.
Я не могу понять, почему файл cookie не сохраняется в браузере при развертывании в IIS.
Обновить
Я попытался создать новый веб-сайт в IIS, который использует в качестве цели папку, в которой развернуто приложение .Net5, а не использует его в качестве дополнительного приложения, и таким образом файл cookie правильно сохраняется.
Комментарии:
1. Вы работаете по протоколу HTTPS?
2. Нет, как я уже писал, я использую http
3. Если файл cookie помечен как безопасный (как и должно быть для файла cookie идентификации), он не будет отправлен по протоколу HTTP.
4. Попробуйте перейти на https, добавить заголовок cookie_secure и снова протестировать.