RequestVerificationToken cookie не присутствует в ответе - PullRequest
2 голосов
/ 21 января 2010

Мое приложение ASP.NET MVC предотвращает CSRF-атаки, используя атрибут ValidateAntiForgeryToken и вызывая Html.AntiForgeryToken, чтобы написать скрытый элемент ввода со значением токена, а также поместить токен в файл cookie.

Мой журнал исключений сообщает о случаях возникновения исключения HttpAntiForgeryException, которые выглядят так, как будто они были вызваны действительными запросами (реферер выглядит правильно). Ответ, вызывающий исключение, также содержит __RequestValidationToken в поле формы со значением токена. Однако в запросе отсутствует необходимый файл cookie, что приводит к сбою проверки и возникновению исключения.

Я пытаюсь понять, почему этот cookie отсутствует, и нашел следующие возможные причины:

  1. Коллекция печенья заполнена для домен. - Если бы это было так здесь я ожидаю увидеть 20/50 печенье в каждом запросе (кстати, все Агентами пользователя являются IE7 и IE8) и каким-то образом печенье сбрасывается. Я вижу от 3 до 23 печенье в различных случаях исключение
  2. Предел данных куки был достиг. - Этого не происходит. От глядя на бревна, я вижу коллекция печенья мала.
  3. Ответ отправляется обратно прежде чем печенье может быть добавлено. - Не уверен насчет этого. Вручную вызов Reponse.Flush в голову приводит к исключению, заявляющему Коллекция куки не может быть изменена после отправки ответа.

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

Ответы [ 2 ]

6 голосов
/ 08 апреля 2011

У меня была точно такая же проблема. Мой контент был представлен через междоменный iframe. В соответствии с Адамом Янгом , IE будет автоматически блокировать сторонние куки, если вы не определите политику P3P в заголовке.

Я добавил код, чтобы внедрить политику p3p в заголовок и просто вызывать его из каждого действия, которое я использую в моем iframe. До сих пор мы не видели, чтобы эта ошибка появлялась. Я надеюсь, что это решение поможет кому-то еще.

public static void SetP3PCompactPolicy()
{
    HttpContext.Current.Response.AddHeader("p3p", 
    "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
}

Я также определил машинный ключ , хотя я не уверен, что это было необходимо.

2 голосов
/ 24 апреля 2014

Согласно ответу Джоша (проблема между доменами внутри iFrame), я поместил кусок кода в метод BeginExecute моего контроллера, чтобы добиться желаемого поведения для каждого вызова. В дополнение к базовому контроллеру, на котором основан любой другой контроллер, вы можете добиться того, что все ваши действия будут выполняться, если ваш сайт встроен в iFrame.

protected override IAsyncResult BeginExecute(System.Web.Routing.RequestContext requestContext, AsyncCallback callback, object state)
{
    requestContext.HttpContext.Response.AddHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");

    return base.BeginExecute(requestContext, callback, state);
}
...