.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)