Я не уверен, что это то, что вы ищете, но я постараюсь объяснить, как я достиг этого в аналогичном случае.
Прежде всего в Angular есть встроенные помощники для обработки XSRF:
Итак, самое сложное - создать собственное промежуточное ПО XSRF на уровне API.
Я сделал это некоторое время назад для одного из моих приложений, которое было построено с Angular 6 на передней панели и ASP.NET Core WebApi на задней части.
Статья, которая мне в этом помогает:
Ваше промежуточное ПО может выглядеть так:
public class AntiForgeryTokenMiddleware
{
private readonly RequestDelegate _next;
private readonly IAntiforgery _antiforgery;
public AntiForgeryTokenMiddleware(RequestDelegate next, IAntiforgery antiforgery)
{
_next = next;
_antiforgery = antiforgery;
}
public Task Invoke(HttpContext context)
{
if (context.Request.Path.Value.IndexOf("/your api endpoint, e.g. /api", StringComparison.OrdinalIgnoreCase) != -1)
{
var tokens = _antiforgery.GetAndStoreTokens(context);
context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions { HttpOnly = false, Secure = false });
}
return _next(context);
}
}
Затем, согласно упомянутой статье, вы должны добавить его к сервисам в методе ConfigureServices класса Startup:
services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");
И использовать его в методе Configure:
app.UseAntiforgeryToken();
И, конечно, чтобы использовать его, вы должны украсить свои методы API с помощью атрибута [ValidateAntiForgeryToken].
Тогда в вашем приложении Angular вы можете создать HttpInterceptor для отправки токена только тогда, когда это необходимо.
@Injectable()
export class XsrfInterceptor implements HttpInterceptor {
constructor(private tokenExtractor: HttpXsrfTokenExtractor) {}
private actions: string[] = ["POST", "PUT", "DELETE"];
private forbiddenActions: string[] = ["HEAD", "OPTIONS"];
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let token = this.tokenExtractor.getToken();
let permitted = this.findByActionName(request.method, this.actions);
let forbidden = this.findByActionName(request.method, this.forbiddenActions);;
if (permitted !== undefined && forbidden === undefined && token !== null) {
request = request.clone({ setHeaders: { "X-XSRF-TOKEN": token } });
}
return next.handle(request);
}
private findByActionName(name: string, actions: string[]): string {
return actions.find(action => action.toLocaleLowerCase() === name.toLocaleLowerCase());
}
}