Почему я получаю сообщение об ошибке "Потенциально опасное значение Request.Form было обнаружено с помощью ошибки клиента"?
Я создал новый сайт ASP.NET MVC 3/.NET Framework 4.0 с использованием шаблона "Интернет-приложение". Я использовал Nuget для установки пакета Windows Azure Web Role (MVC3), а затем после Прохождение доступа к службе контроля доступа для настройки идентификатора Windows Live ID и аутентификации Google.
Вскоре я наткнулся на "потенциально опасное значение" Request.Form ", которое было обнаружено с помощью" клиента "и последовало за статьей и <pages validateRequest="false">
как в корневом web.config, так и в Views\web.config
Копирование SampleRequestValidator
из WIF SDK в проект и установка <httpRuntime requestValidationType="SampleRequestValidator"/>
в web.configs
Я также пробовал варианты их без успеха.
Любые идеи?
Здесь полное исключение:
Сведения об исключении: System.Web.HttpRequestValidationException: потенциально опасное значение Request.Form было обнаружено у клиента (wresult = "<t:RequestSecurityTo...
" ).
Описание: Проверка запроса обнаружила потенциально опасное значение ввода клиента, а обработка запроса была прервана. Это значение может указывать на попытку скомпрометировать безопасность вашего приложения, например атаку межсайтового скриптинга. Чтобы страницы могли переопределять параметры проверки запроса приложения, установите атрибут requestValidationMode в разделе конфигурации httpRuntime для запросаValidationMode = "2.0". Пример: <httpRuntime requestValidationMode="2.0" />
. После установки этого значения вы можете отключить проверку запроса, установив validateRequest = "false" в директиве "Страница" или в разделе конфигурации <pages>
. Тем не менее, настоятельно рекомендуется, чтобы ваше приложение явно проверяло все входы в этом случае. Для получения дополнительной информации см. http://go.microsoft.com/fwlink/?LinkId=153133.
Трассировка стека:
[HttpRequestValidationException (0x80004005): потенциально опасное значение Request.Form было обнаружено у клиента (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
Ответы
Ответ 1
Мне не удалось найти техническую причину, почему это не работает. Однако с точки зрения бизнес-требований это неправильный пример, чтобы основывать мое конкретное решение, потому что он запрашивает аутентификацию до того, как будут доступны какие-либо страницы. Однако доступ к домашней странице должен быть анонимным, поэтому можно использовать кнопку "Вход".
Вместо этого я нашел MVC3 Custom Login Sample, который отвечает этим требованиям и работает.
Ответ 2
Вы можете попробовать украсить действие контроллера, которое вы отправляете (и тот, который выбрасывает это исключение) с помощью атрибута [ValidateInput(false)]
(по оставляя <httpRuntime requestValidationMode="2.0"/>
в web.config
).
Ответ 3
У меня была та же проблема.
Вот пример моего решения:
[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.
Ответ 4
Я написал небольшую заметку в блоге об этом здесь: http://erikbra.wordpress.com/2012/04/17/wif-saml-token-post-and-requestvalidationmode2-0/. Нет необходимости отключать проверку запроса или устанавливать его на 2.0 для всего вашего сайта.
Короче говоря, вам нужно только изменить режим requestValidationMode
to 2.0 на конкретный URL-адрес, по которому WIF отправляет обратно токен SAML. Это можно сделать с помощью элемента (см. "Элемент местоположения (схема параметров ASP.NET)" ) в вашем web.config, например:
<location path="WIFHandler">
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
</location>
Местоположение "WIFHandler" не должно существовать в вашем приложении, так как WIF будет сокращать конвейер до того, как ASP.NET попытается обработать запрос и перенаправит вас на возвращаемый url (ru
в параметре wctx
из токена POST SAML).
В разделе конфигурации WIF файла web.config обязательно сопоставьте параметр "ответ" с местом, в котором вы установите режим проверки запроса в режим 2.0:
<microsoft.identityModel>
<service>
<federatedAuthentication>
<wsFederation passiveRedirectEnabled="true"
issuer="https://localhost/STS/"
realm="https://localhost/MyApp/"
reply="https://localhost/MyApp/WIFHandler/" />
(...)
Ответ 5
Сначала - узкий, откуда это происходит. Используйте скрипач, чтобы выяснить, какое поле вызывает проблему. Элементы, такие же простые, как: < s будут вызывать эту ошибку при отправке без кодирования. Также вы можете украсить свой МОДЕЛЬ атрибутом [AllowHtml] и попытаться не включать кодировку 2.0 - это немного опасно.
Ответ 6
Копирование SampleRequestValidator из WIF SDK в проект и установка в web.configs
Это должно исправить это. Можете ли вы проверить, действительно ли выполняется код? Если вы поместите контрольную точку в валидатор запроса, ударит ли она?
Я предполагаю, что вы положили <httpRuntime...>
под <system.web>
правильно?
Ответ 7
Я не вижу здесь никакого упоминания. так что вот оно.
В дополнение к "[ValidateInput (false)]" в вашем aspx вам может потребоваться добавить это на ваш <% @Page... >
<%@ Page ValidateRequest="false">
Это позволит отключить проверку запроса на основе каждой страницы вместо всего веб-приложения.
Ответ 8
Я столкнулся с этой проблемой при прохождении учебника "Один вход из Active Directory в приложение Windows Azure". В моем случае проблема заключалась в том, что я случайно поместил значение <httpRuntime ... />
в неправильный раздел <system.web />
в свой файл web.config(я этого не заметил первоначально, но там есть новый раздел <location>
с контуром "FederationMetadata", который также содержит system.web.). Значение должно быть помещено в верхний уровень <system.web>
.
Ответ 9
На первый взгляд это выглядит как ошибка в библиотеке Azure Mvc3. MVC 3 предоставляет специальные API-интерфейсы, которые позволяют извлекать неутвержденные значения из коллекции Form, но модуль, похоже, не использует их.