Проблемы с файлами cookie API - попытка создать токен XSRF / CSRF в угловых - PullRequest
0 голосов
/ 08 декабря 2018

Мой метод веб-API для инициализации сеанса успешно возвращает cookie.Внешний интерфейс в угловом формате, поэтому я вызываю cookie XSRF-TOKEN, потому что angular говорит, что примет это и превратит в заголовок X-XSRF-TOKEN во всех последующих запросах.

Для справки в ИнтернетеМетод контроллера API GET, который создает cookie, выглядит следующим образом:

        ...
        HttpResponseMessage resp = new HttpResponseMessage() {
            Content = new JsonContent(results)
        };
        if (results.Token != null) {
            var cookie = new CookieHeaderValue("XSRF-TOKEN", results.Token);
            cookie.Expires = DateTimeOffset.Now.AddDays(365);
            cookie.Domain = Request.RequestUri.Host;
            cookie.Path = "/";
            cookie.HttpOnly = false;
            resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });
        }
        return resp;
        ...

Используя Fiddler, я вижу cookie в ответе.Теперь я ожидаю 2 вещи

  1. все последующие вызовы API для того же домена должны включать этот файл cookie в заголовок запроса
  2. Angular должен добавить заголовок X-XSRF-TOKEN Iупоминалось ранее

Ничего не происходит (я проверяю с Fiddler).Я пробовал использовать сайт и API в одном домене (например, localhost) и в разных доменах.

Некоторые источники, которые я проверял:

Я также попытался добавить

$httpProvider.xsrfWhitelistedOrigins = [webServicesPath];

, где webServicesPath - это переменная, которую я использую для пути API, но это не имеет значения.

1 Ответ

0 голосов
/ 12 февраля 2019

Вы должны использовать что-то вроде следующего

public void Configure(IApplicationBuilder app, IAntiforgery antiforgery) {

    context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions() { HttpOnly = false });

}

public void ConfigureServices(IServiceCollection services) {

    // Angular's default header name for sending the XSRF token.
    services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");    
}
...