.NET CORE API с Angular 4 - токен cookie и токен запроса были заменены

Я продолжаю получать это сообщение при попытке реализовать XSRF с Angular и.NET CORE: "Проверка предоставленного токена защиты от подделки завершилась неудачно. Токен cookie и токен запроса были заменены". У меня имена файлов cookie и заголовков настроены одинаково как в Angular, так и в API. У кого-нибудь есть идеи?

Процесс

Angular делает первоначальный вызов этого метода API для получения cookie

    [HttpGet("startSession")]
    public async Task<IActionResult> StartSession()
    {
        AntiforgeryTokenSet tokens = this.antiForgery.GetAndStoreTokens(this.HttpContext);

        this.HttpContext.Response.Cookies.Append(this.options.Value.Cookie.Name, tokens.RequestToken, new CookieOptions { HttpOnly = false });

        return this.Ok(
            new
            {
                Success = true
            });
    }

Затем Angular перехватывает следующий запрос POST и слегка переопределяет обработку XSRF по умолчанию, так как мне нужно, чтобы она работала для URL-адресов HTTPS.

    // Override default Angular XSRF handling since it won't work for         
    absolute URLs and we have to prefix with "https://"
    // Source:https://github.com/angular/angular/blob/master/packages/common/http/src/xsrf.ts
    @Injectable()
    export class HchbHttpXsrfInterceptor implements HttpInterceptor {
    constructor(
    private tokenService: HttpXsrfTokenExtractor) {}

    intercept(req: HttpRequest<any>, next: HttpHandler): 
    Observable<HttpEvent<any>> {
    const headerName = 'X-XSRF-TOKEN';
    const lcUrl = req.url.toLowerCase();
    // Skip both non-mutating requests.
    // Non-mutating requests don't require a token
    // anyway as the cookie set
    // on our origin is not the same as the token expected by another origin.
    if (req.method === 'GET' || req.method === 'HEAD' ) {
         return next.handle(req);
    }
    const token = this.tokenService.getToken();

    // Be careful not to overwrite an existing header of the same name.
    if (token !== null && !req.headers.has(headerName)) {
       req = req.clone({headers: req.headers.set(headerName, token)});
    }
    return next.handle(req);
    }
    }

1 ответ

Решение

Я столкнулся с той же проблемой, и я думаю, что нашел проблему. options.Cookie.Name в AddAntiforgery должен отличаться от файла cookie, который вы установили вручную context.Response.Cookies.Append,

Попробуйте изменить имя одного из них, и оно будет работать. Прямо сейчас вы переопределяете сгенерированный файл cookie, который использует options.Cookie.Name имя с tokens.RequestToken значение.

Вы можете заметить разницу в инструментах разработчика.

  • Маркер по умолчанию, созданный с использованием options.Cookie.Name помечен как http only (HttpOnly = true)
  • Прикрепленный вручную токен с помощью context.Response.Cookies.Append помечен как HttpOnly = false

Второй читается из JS/Angular (вы можете прочитать его в JS, потому что HttpOnly=false и отправляется в качестве заголовка в ваших запросах ajax и проверяется на соответствие стандартному, который не может быть прочитан из JS)

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