.NET MVC, сделать что-то после сбоя проверки ValidateAntiForgeryToken - PullRequest
0 голосов
/ 25 мая 2018

В моей форме у меня есть

@Html.AntiForgeryToken()

, а действие принимающего контроллера имеет

    [HttpPost, ValidateAntiForgeryToken]  
    public ActionResult Login(LoginViewModel model)  
    {
      //if detects a post request missing token, 
      //I wish to log form info for later inspection
    }

Когда происходит пропущенный токен после запроса, среда не переходит в метод.Если я захочу зарегистрировать информацию о форме для последующего осмотра, что я могу сделать и где?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Другой подход заключается в создании настраиваемого фильтра исключений для перехвата исключений AntiForgery и регистрации в нем деталей формы, подробности ниже:

public class AntiForgeryExceptionAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        // ANTIFORGERY TOKEN NOT PRESENT
        if (!filterContext.ExceptionHandled && filterContext.Exception is HttpAntiForgeryException)
        {
            var request = new HttpRequestWrapper(System.Web.HttpContext.Current.Request);
            // Use your own logging service to log the results
            var _logger = new LoggingService();
            foreach (var key in request.Form.AllKeys)
            {
                var value = request.Form[key];
                // "key" is the form input name and "value" is the form input value
                _logger.Log("~~> " + key + " ==> " + value);
            }

            filterContext.ExceptionHandled = true;
        }
    }
}

и регистрация настраиваемого фильтра в global.asax:

protected void Application_Start()
{
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    GlobalFilters.Filters.Add(new AntiForgeryExceptionAttribute());
}
0 голосов
/ 25 мая 2018
 [HttpPost]
 public async Task<IActionResult> Method(int id)
 {
        var formParameters = await Context.Request.ReadFormAsync();
        var requestVerification = formParameters["RequestVerificationToken"];
        string cookieToken = null;
        string formToken = null;

        if (!string.IsNullOrWhiteSpace(requestVerification))
        {
        var tokens = requestVerification.Split(':');

        if (tokens != null && tokens.Length == 2)
        {
            cookieToken = tokens[0];
            formToken = tokens[1];
        }


        var antiForgery = Context.RequestServices.GetService<AntiForgery>();
        try
        {
            antiForgery.Validate(Context, new AntiForgeryTokenSet(formToken, cookieToken))}
        catch
        {
           //log
        }
  }

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

...