У меня была та же проблема в проекте, который мы хотели продолжать использовать параметры запроса проверки в качестве первой линии защиты. Проблема заключается в том, что в веб-формах значения форм проверяются на начальном этапе запроса процесса.
То, как мы в конце концов решили это, выглядит следующим образом:
- Запретить проверку заявки для проекта
- Создание пользовательского валидатора, который наследуется от базового валидатора
- Использовать пользовательский валидатор на всех страницах (или главной странице)
наш пользовательский валидатор похож на приведенный ниже:
public class UserInputValidator : BaseValidator
{
private HttpRequest Request
{
get { return HttpContext.Current.Request; }
}
protected override bool ControlPropertiesValid()
{
//Override the base functionality because this will check for a control to validate, what we won't do.
return true;
}
protected override bool EvaluateIsValid()
{
bool isValid = true;
var message = new StringWriter();
if (Request != null)
{
//Validate input will enable request validation.
Request.ValidateInput();
NameValueCollection formValues = Request.Form;
foreach (string formKey in formValues.Keys)
{
try
{
#pragma warning disable 168
//Access the form variable to trigger request validation.
string formValue = formValues[formKey];
#pragma warning restore 168
}
catch (HttpRequestValidationException)
{
string orgValue = Request.Unvalidated.Form[formKey];
message.WriteLine("The following input is not allowed: {0}", HttpUtility.HtmlEncode(orgValue));
isValid = false;
}
}
}
ErrorMessage = message.ToString();
return isValid;
}
}
Это работает, потому что, когда проверка запроса отключена, ValidateInput не вызывается. Вызывая этот метод при проверке страницы, мы принудительно активируем проверку запроса для запроса.
Следующее, что нам нужно сделать, - это получить доступ к каждому значению из коллекции форм (по крайней мере, в asp.net 4.5), поэтому исключение срабатывает при необходимости.