Анти подделка с токен API и угловой - PullRequest
0 голосов
/ 31 октября 2018

Я работаю над приложением Angular 6 с SSO-логином и .net core web API. Код впервые попадает в конец URL-адреса / токена, который является пост-операцией. Как мне сделать анти подделку в этом сценарии. Пожалуйста, объясните поток передачи токена

1 Ответ

0 голосов
/ 09 мая 2019

Я не уверен, что это то, что вы ищете, но я постараюсь объяснить, как я достиг этого в аналогичном случае.

Прежде всего в 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());
    }
}
...