Почему я получаю "потенциально опасный запрос".Значение формы было обнаружено от клиента" ошибку?
Я создал новый ASP.NET сайт MVC 3 / .NET Framework 4.0 с использованием шаблона "интернет-приложение". Я использовал Nuget для установки веб-роль Windows Azure (MVC3) и затем пошаговое руководство Службы контроля доступа для настройки Windows Live ID и аутентификации Google.
довольно скоро я наткнулся на " потенциально опасную просьбу.Значение формы было обнаружено от клиента" ошибки и после статьи Окна тож Фонда Вики чтобы попытаться решить эту проблему. К сожалению, ничего, что я пробовал, работает, в том числе:
задание
<httpRuntime requestValidationMode="2.0"/>
и<pages validateRequest="false">
в корневой сети.конфигурация и представленияweb.configкопирование
SampleRequestValidator
из WIF SDK в проект и настройки<httpRuntime requestValidationType="SampleRequestValidator"/>
в обоих web.configs
Я также пробовал варианты этих без успеха.
любой идеи?
вот полное исключение:
Сведения Об Исключении:.Сеть.HttpRequestValidationException: потенциально опасный запрос.От клиента было обнаружено значение формы (wresult="<t:RequestSecurityTo...
").
описание: проверка запроса обнаружила потенциально опасное входное значение клиента, и обработка запроса была прервана. Это значение может указывать на попытку скомпрометировать безопасность приложения, например атака межсайтовых сценариев. Чтобы разрешить страницам переопределять параметры проверки запроса приложения, задайте для атрибута requestValidationMode в разделе конфигурации httpRuntime значение requestValidationMode= "2.0". Пример: <httpRuntime requestValidationMode="2.0" />
. После установки этого значения можно отключить проверку запроса, установив validateRequest= "false" в директиве Page или в конфигурации. Однако, настоятельно рекомендуется, чтобы ваше приложение явно проверять все входные данные в этом случае. Дополнительные сведения см. В разделеhttp://go.microsoft.com/fwlink/?LinkId=153133.
Трассировка Стека:
[HttpRequestValidationException (0x80004005): потенциально опасный запрос.От клиента было обнаружено значение формы (wresult="<t:RequestSecurityTo...
").]
System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +8755668 System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection) +122 System.Web.HttpRequest.get_Form() +114 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.IsSignInResponse(HttpRequest request) +75 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request, Boolean onPage) +205 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request) +41 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs args) +117 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
9 ответов
вы можете попробовать украсить действие контроллера, которое вы публикуете (и тот, который бросает это исключение) с [ValidateInput(false)]
(оставив <httpRuntime requestValidationMode="2.0"/>
на web.config
).
У меня была та же проблема.
вот пример моего решения:
[ValidateInput(false)]
public ActionResult *YourMethodName*(FormCollection forms)
{
// Encoded String
string EncodedValue = Server.HtmlEncode(forms[*name or index*]);
// Normal String
string value = forms[*name or index*]
//....
}
вам ничего не нужно в вашем webconfig.
я написал небольшую заметку в блоге об этом здесь: http://erikbra.wordpress.com/2012/04/17/wif-saml-token-post-and-requestvalidationmode2-0/ - ... Нет необходимости отключать проверку запросов или устанавливать значение 2.0 для всего сайта.
короче говоря, вам нужно только изменить requestValidationMode
в режим 2.0 по определенному URL-адресу, на который WIF отправляет маркер SAML. Это можно сделать с помощью элемента (см. элемент location (ASP.NET схема настроек) для подробностей) в вашем интернете.конфиг, вот так:
<location path="WIFHandler">
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
</location>
местоположение "WIFHandler" не должно существовать в вашем приложении, так как WIF будет сокращать конвейер до ASP.NET пытается обработать запрос и перенаправить вас на URL-адрес возврата (ru
на wctx
параметр сообщения токена SAML) вместо этого.
в разделе конфигурации WIF в интернете.конфигурационный файл, обязательно сопоставьте параметр "ответить" с местоположением, где вы установили режим проверки запроса в режим 2.0:
<microsoft.identityModel>
<service>
<federatedAuthentication>
<wsFederation passiveRedirectEnabled="true"
issuer="https://localhost/STS/"
realm="https://localhost/MyApp/"
reply="https://localhost/MyApp/WIFHandler/" />
(...)
первый - узкий, откуда это исходит. Используйте fiddler, чтобы исследовать, какое поле вызывает проблему. Такие простые элементы, как:
копирование SampleRequestValidator из WIF SDK в проект и настройка в обоих web.configs
это должно исправить. Можете ли вы проверить, что код действительно выполняется? Если вы поместите точку останова в валидатор запросов, она попадет?
Я предполагаю, что вы положили <httpRuntime...>
под <system.web>
верно?
Я не вижу здесь никакого ответа. Ну вот и все.
в дополнение к " [ValidateInput(false)]" в вашем aspx вам может потребоваться добавить это на страницу
<%@ Page ValidateRequest="false">
Это позволит отключить проверку запросов на каждой странице, а не всего веб-приложения.
я столкнулся с этой проблемой при прохождении через учебник" единый вход из Active Directory в приложение Windows Azure". В моем случае проблема заключалась в том, что я нечаянно поместил <httpRuntime ... />
значение в неположенном в моем web.файл config (я изначально не заметил этого, но есть новый <location>
раздел с путем "FederationMetadata", который также содержит system.сеть.). Значение должно быть помещено в верхний уровень .
на первый взгляд это похоже на ошибку в библиотеке Azure Mvc3. В MVC 3 предоставляет специальные API, которые позволяют получать непроверенные значения из коллекции форма, но модуль не представляется использовать их.
Я не смог найти техническую причину, по которой это не работает. Однако с точки зрения бизнес-требований это неправильный образец для моего конкретного решения, поскольку он запрашивает аутентификацию перед доступом к страницам. Однако доступ к домашней странице должен быть анонимным, поэтому можно использовать кнопку "Войти".
вместо этого я нашел MVC3 пользовательский образец входа что соотвествует эти и оно работает.