Подтвердить что ты не робот

Почему я получаю сообщение об ошибке "Потенциально опасное значение 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

4b9b3361

Ответ 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, но модуль, похоже, не использует их.