antiforgeryToken для защиты некоторых действий в веб-API, вызываемых из приложения angularjs.

У меня есть два веб-проекта в visualstudio.net 2013.

  • Один проект в WebApi2 с контроллерами и действиями (простой)
  • второй проект - это чистое приложение angularjs без MVC или WebApi (я начал с пустого веб-проекта)

приложение angularjs вызывает службу, работающую в приложении webApi2.

Я хотел бы знать, можно ли защитить некоторые действия моих контроллеров в моем приложении webapi2 с помощью AntiforgeryToken. (атрибут antiforgeryToken) Я нашел несколько сообщений в Интернете, но они требуют использования AntiForgery.GetTokens в моем приложении angular, и поэтому мне нужно установить все пакеты mvc и razor... nuget. (см. этот пост: http://www.fredonism.com/archive/protect-your-web-api-from-csrf-attacks.aspx)

Я хотел бы избежать этого или есть решение для использования этого антифальсифицированного токена с минимальными установленными пакетами nuget?

Другими словами: возможно ли защитить некоторые из моих действий контроллера webapi с помощью токена защиты от подделки без использования материала MVC.

С Уважением


person Cedric Dumont    schedule 17.12.2014    source источник


Ответы (2)


Хотя уже слишком поздно для этого вопроса, возможно, в будущем это принесет пользу другим.

Сначала создайте промежуточное ПО для обработки запросов в проекте веб-API.

public class AntiForgeryMiddleware
    {
        private readonly RequestDelegate next;
        private readonly string requestTokenCookieName;
        private readonly string[] httpVerbs = new string[] { "GET", "HEAD", "OPTIONS", "TRACE", "POST" };

        public AntiForgeryMiddleware(RequestDelegate next, string requestTokenCookieName)
        {
            this.next = next;
            this.requestTokenCookieName = requestTokenCookieName;
        }

        public async Task Invoke(HttpContext context, IAntiforgery antiforgery)
        {

            string path = context.Request.Path.Value;

            if (path != null && path.ToLower().Contains("yourMethodThatGeneratesTheToken"))
            {
                if (httpVerbs.Contains(context.Request.Method, StringComparer.OrdinalIgnoreCase))
                {
                    var tokens = antiforgery.GetAndStoreTokens(context);

                    context.Response.Cookies.Append(requestTokenCookieName, tokens.RequestToken, new CookieOptions()
                    {
                        HttpOnly = false
                    });


                } 
            }

            context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");

            await next.Invoke(context);
        }
    }

Добавьте промежуточное ПО в метод Configure файла Startup.cs.

app.UseAntiforgeryTokenMiddleware("X-XSRF-TOKEN");

В вашем угловом перехватчике вы можете установить заголовок следующим образом, взяв файл cookie.

var xsrfToken = this.cookieService.get("X-XSRF-TOKEN"); req.headers.set('X-XSRF-TOKEN', xsrfToken)

чтобы сохранить файл cookie, вам нужно добавить req = req.clone({ withCredentials: true }); вверху перехватчика.

person Uthpala Pathirana    schedule 06.07.2018

В пустом веб-приложении ASP.NET:

Install-Package Microsoft.AspNet.WebPages

К моменту написания этой статьи также будут добавлены следующие зависимые пакеты:

  • Microsoft.AspNet.Razor
  • Microsoft.Web.Infrastructure

а затем в вашем Index.aspx, который можно использовать для размещения вашего углового приложения:

<%@ Page Language="C#" %>
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <%= System.Web.Helpers.AntiForgery.GetHtml().ToString() %>
</body>
</html>

будет генерировать:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <input name="__RequestVerificationToken" type="hidden" value="QbixKR4muYghE6OnaBc2l8KqjumtU64-Zj7n7ktxyXeAhFx1FDgg43iJoeO9Eu94FvFxlBfpyKgFDAglSm4KAc0ZA-D30H-O7rSlq4x5nVA1" />
</body>
</html>
person Darin Dimitrov    schedule 17.12.2014
comment
Я уже пробовал это решение, но мне было интересно, есть ли решение вообще не использовать бритву. попробую решение, предложенное @jack.the.ripper, потом сделаю выводы. спасибо - person Cedric Dumont; 18.12.2014
comment
OP специально сказал, что не использует библиотеки MVC. - person Uriah Blatherwick; 12.12.2017
comment
Эти библиотеки работают и в веб-формах. Microsoft.AspNet.WebPages и System.Web.Helpers.AntiForgery.GetHtml() можно использовать в веб-формах. - person AaronLS; 27.07.2018