У меня есть .net core 2. * API с приложением Angular 6. *, которое я пытаюсь защитить от атак XSRF.
При входе в систему мы получаем токен авторизации, а затем делаем еще один вызов для получения токена XSRF.
На стороне клиента у нас есть перехватчик HTTP, который добавляет токен в заголовок любых последующих запросов к API.
Код API выглядит корректно, и я вижу, что заголовок ответа содержит маркер XSRF, однако, когда последующий запрос к API Request.Headers ["X-XSRF-TOKEN"] существует, но он существует пуст.
Может кто-нибудь посоветовать мне, где я мог ошибиться?
Я следовал этому примеру: https://www.blinkingcaret.com/2018/11/29/asp-net-core-web-api-antiforgery/
Контроллер API
[ApiController]
public class AntiForgeryController : Controller
{
private IAntiforgery _antiForgery;
public AntiForgeryController(IAntiforgery antiForgery)
{
_antiForgery = antiForgery;
}
[Route("api/antiforgery")]
[IgnoreAntiforgeryToken]
public IActionResult GenerateAntiForgeryTokens()
{
var tokens = _antiForgery.GetAndStoreTokens(HttpContext);
Response.Cookies.Append("XSRF-REQUEST-TOKEN", tokens.RequestToken, new Microsoft.AspNetCore.Http.CookieOptions
{
HttpOnly = false
});
return NoContent();
}
}
Метод обслуживания пользовательского интерфейса.
getAntiForgeryToken(): any {
return this.http.get(`${this.baseURL}/antiforgery`).pipe(map(x => {
return true;
}));
}
Интерфейс http UI.
export class AddCsrfHeaderInterceptorService implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let requestToken = this.getCookieValue('XSRF-REQUEST-TOKEN');
return next.handle(req.clone({
headers: req.headers.set('X-XSRF-TOKEN', requestToken)
}));
}
private getCookieValue(cookieName: string) {
const allCookies = decodeURIComponent(document.cookie).split('; ');
for (let i = 0; i < allCookies.length; i++) {
const cookie = allCookies[i];
if (cookie.startsWith(cookieName + '=')) {
return cookie.substring(cookieName.length + 1);
}
}
return '';
}
}