Как я могу переопределить RequestValidation в веб-API ASP.NET
У меня проблемы с запросами, которые включают "опасные символы" как часть URL-адреса веб-API. Url-адрес включает&, который правильно закодирован Url-адресом, но по-прежнему вызывает проверку запроса ASP.NET ошибка.
В отличие от MVC, похоже, нет атрибута [ValidateInput(false)] для принудительного и отключения этой функции.
4 ответов
оказывается, ответ для этого в интернете.настройка с помощью:
<system.web>
<httpRuntime requestPathInvalidCharacters="" />
</system.web>
вы можете установить это глобально или на суб-директории. Вы можете использовать <location path="">
элемент, чтобы указать этот параметр только под определенным тропинкам. Например, если ваш маршрут веб-API, который был затронут, жил под api / images вы можете сделать следующее:
<location path="api/images">
<system.web>
<httpRuntime requestPathInvalidCharacters="" />
</system.web>
</location>
больше информации: https://msdn.microsoft.com/en-us/library/e1f13641 (v=против 100).aspx
С RequestValidation набор для 4.0 в конфигурации ответа нет. Однако вы можете вернуться к проверке запроса 2.0, и в этом случае атрибут MVC работает так, как вы ожидаете: проверка по умолчанию и явное переопределение при необходимости.
<httpRuntime executionTimeout="300" requestValidationMode="2.0" />
подробно говорили об этом и некоторые варианты здесь: http://www.west-wind.com/weblog/posts/2010/Aug/19/RequestValidation-Changes-in-ASPNET-40
вы можете получить более мелкозернистый контроль над этим, установив requestValidationType
атрибут httpRuntime
элемент пользовательского типа, который наследует от System.Web.Util.RequestValidator
и переопределяет IsValidRequestString
.
к сожалению, это не часть конвейера WebAPI, поэтому не может напрямую проверять такие вещи, как фильтры действий (т. е. атрибуты методов контроллера).
однако, если вы специально заботитесь о проверке полей формы, валидатор не вызывается на них, пока вы не получите доступ их, что происходит после запуска фильтров действий, поэтому вы можете отказаться от проверки с помощью атрибута, создав следующие классы...
public class AllowFormHtmlAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
HttpContext.Current.Items["AllowFormHtml"] = true;
}
}
public class CustomRequestValidator : RequestValidator
{
protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
{
if (context.Items["AllowFormHtml"] as bool? == true && requestValidationSource == RequestValidationSource.Form)
{
validationFailureIndex = 0;
return true;
}
return base.IsValidRequestString(
context, value, requestValidationSource, collectionKey, out validationFailureIndex);
}
}
... Затем просто аннотируйте свой метод контроллера с помощью [AllowFormHtml]
однако, если вы получаете доступ к полям формы непосредственно из HttpRequest, проще использовать HttpRequest.Unvalidated
, который обходит проверку.
per @Levi наш веб-охранник:
Config-единственный способ сделать это. Даже
отключив его в Web.config не обязательно ужасная идея. Если вы следуете хорошей практике безопасности, проверяя и кодируя ненадежные данные, вполне нормально применять ее в масштабах всего приложения.