Reginald Braithwaite (иначе Раганвальд) писал большой ряд на combinators в Ruby в его новом блоге, гомографический .
, В то время как он не делает (к моему знанию) смотрят на сам Y-combinator, он действительно смотрит на другой combinators, например:
и несколько сообщений о том, как Вы можете использование их.
Нет ничего конкретного, что вам нужно сделать в этом случае. ASP.NET MVC просто повторно использует одно и то же значение для всех форм, поэтому ему не нужно знать, какая форма отправила запрос для его проверки. Просто вставьте Html.AntiForgeryToken()
в каждую форму и украсьте каждое действие контроллера, на которое вы отправляете сообщение, с помощью атрибута [ValidateAntiForgeryToken]
, и все будет в порядке.
Здесь есть отличная статья . Я указал на несколько важных разделов.
В двух словах: если токен можно десериализовать из коллекции файлов cookie запроса, он будет использовать этот токен вместо генерации нового. Если токен не существует в коллекции файлов cookie, он создает новый экземпляр «AntiForgeryToken» и случайным образом генерирует новый 16-байтовый массив для представления токена.
public AntiForgeryToken GetCookieToken(HttpContextBase httpContext)
{
HttpCookie cookie = httpContext.Request.Cookies[this._config.CookieName];
if (cookie == null || string.IsNullOrEmpty(cookie.Value))
return (AntiForgeryToken) null;
return this._serializer.Deserialize(cookie.Value);
}
После генерации первого токена и сохранения его в коллекции файлов cookie все последующие вызовы вспомогательного метода «Html.AntiForgeryToken ()» будут следовать тем же шагам, и повторно использовать существующий токен из коллекции файлов cookie. вместо генерации нового значения.
Поскольку это файл cookie сеанса, это означает, что значение токена защиты от подделки генерируется только один раз во время сеанса браузера и используется повторно для всех последующих вызовов.
Так почему же значения скрытых полей отличаются друг от друга, если они используют один и тот же токен?
Таким образом, хотя зашифрованные значения могут выглядеть по-разному, дешифрованные значения одинаковы.
byte[] one = MachineKey45CryptoSystem.Instance.Unprotect("iAdQj5D0qrMuTggD8WpnOZPlVOfHg_qmPIEjnULAYd1h56cV2cL51rcaY8_UgxQbav5_6KTAtyE52ir1X6GmaS9ZPgw1");
byte[] two = MachineKey45CryptoSystem.Instance.Unprotect("Shvi8Bxe6-a8zfCfDGnxkaC-IETsbjkR9iIylwn-2VRWQ-GtQkdowdFw1biU7dN3j-xPJZHYQPe-hNfWspYjy_ZcCCY1");
byte[] three = MachineKey45CryptoSystem.Instance.Unprotect("ZhaVFngUMLo88jmTIx___BTWlYFyKh1GalwEeffRl0-o3Gu7_m98k6aQjO7IysZIdXxVx6TqL6QIfX19Uwq3Ia6dghA1");
Сравнение всех трех байтовых массивов показывает, что они идентичны.