Почему я получаю "потенциально опасный запрос".Значение формы было обнаружено от клиента" ошибку?

Я создал новый 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 пользовательский образец входа что соотвествует эти и оно работает.