Браузер не отправляет файлы cookie между доменами с включенным CORS - PullRequest
5 голосов
/ 24 июня 2019

У меня есть проект .net core webapi, настроенный на прием перекрестных запросов, например

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}


public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseCors(opts => opts
        .WithOrigins("https://fiddle.jshell.net")
        .AllowCredentials()
        .AllowAnyMethod()
        .AllowAnyHeader());

    app.UseHttpsRedirection();
    app.UseMvc();
}

У него есть контроллер значений с методом GET, например,

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return Ok("cookies: " + string.Join(", ", HttpContext.Request.Cookies.Select(x => x.Key)));
    }
}

Теперь я пытаюсь отправить запрос на выборку из браузера, вот так

fetch('https://api.domain.com/api/values', { 
    headers: 
    { 
      'Content-Type': 'application/json' 
    }, 
    credentials: 'include', 
    mode: 'cors'
})
.then(function(resp){ 
    resp.text().then(function(data) { 
        console.log(data); 
  }) 
})
.catch(function(err){ 
    console.log(err) 
});

Но это не отправляет куки со страницы в API. Что мне здесь не хватает? Я испробовал все решения, которые смог найти, включая отключение сторонних файлов cookie

Обновление

Итак, у меня до сих пор нет ответа на вопрос, почему это не работает, или каких-либо авторитетных источников, в которых говорится, что вы не можете отправлять файлы cookie в междоменный домен (или даже в тот, который говорит о перекрестном происхождении! = Междоменный).

Мы обнаружили, что даже куки с sub-a.domian.com не будут отправляться на sub-b.domain.com. Способ, которым мы «решили» это создать файл cookie, который постоянно привязан к domain.com, потому что эти файлы cookie отправляются на sub-a.domain.com и sub-b.domain.com.

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Браузер не отправляет файлы cookie между доменами с включенным CORS.

Каждый повар имеет домен, связанный с ним, так что вы можете использовать * .abc.com и использовать его на abc.com и всех поддоменах abc.com. Поэтому убедитесь, что ваши куки * .abc.com options.Cookie.Domain = ".contoso.com";

см. Мою ссылку sharecookies, как это

services.AddCors(options =>
        {
            options.AddPolicy(MyAllowSpecificOrigins,
            builder =>
            {
                builder.WithOrigins("http://example.com","*.example.com"
                                    "http://www.contoso.com");
            });
        });
0 голосов
/ 28 июня 2019

Единственное, что делает CORS, - это позволяет браузеру использовать ответ на запрос кросс-источника, он не делает куки-файлы междоменными (см. спецификацию для более подробной информации об условиях прикрепления куки-файла). в запросе не упоминается CORS вообще).

Если файлы cookie можно отправлять по запросу из разных источников, это будет серьезным недостатком безопасности, поскольку это позволит иностранным доменам получать конфиденциальную информацию, например токены сеансов пользователей, из вашего собственного домена. Злой разработчик может создать API, предоставляющий полезную услугу, а затем получить тонны токенов сеанса с веб-сайтов с помощью API (исходные веб-сайты можно легко найти через заголовок Referer).

Поведение, которое вы наблюдали с localhost и другими портами, является нормальным, поскольку порты не учитываются для файлов cookie, что является «по историческим причинам» (для справки: Является ли порт cookie cookie HTTP конкретным? )

Таким образом, оставленные для вас варианты:

  • Установить cookie domain для родительского домена
  • Учитывая, что ваш сервер может работать с заголовками вместо файлов cookie, вообще не используйте файлы cookie (используйте localStorage с javascript и заголовки HTTP, например)
  • Учитывая, что у вас есть руки в инфраструктуре, используйте один домен как для пользовательского интерфейса, так и для API, и выполните некоторые перезаписи URL на стороне сервера (например: входящие запросы, начинающиеся с /api/..., переписываются с локальным URL-адресом API, другие переписываются с локальным URL UI)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...