【问题标题】:Why am I getting the "A potentially dangerous Request.Form value was detected from the client" error?为什么我会收到“从客户端检测到潜在危险的 Request.Form 值”错误?
【发布时间】:2013-11-15 17:37:45
【问题描述】:

我使用“Internet 应用程序”模板创建了一个新的 ASP.NET MVC 3 / .NET Framework 4.0 站点。我使用 Nuget 安装了Windows Azure Web Role (MVC3) 包,然后按照Access Control Service walkthrough 设置了 Windows Live ID 和 Google 身份验证。

很快,我遇到了“从客户端检测到潜在危险的 Request.Form 值”错误,并按照article in the Windows Identity Foundation wiki 尝试解决它。不幸的是,我没有尝试过任何工作,包括:

  • 在根 web.config 和 Views\web.config 中设置 <httpRuntime requestValidationMode="2.0"/><pages validateRequest="false">

  • 从 WIF SDK 复制 SampleRequestValidator 到项目中并在两个 web.configs 中设置 <httpRuntime requestValidationType="SampleRequestValidator"/>

我也尝试过这些变体,但没有成功。

有什么想法吗?

这是完整的例外:


异常详细信息: System.Web.HttpRequestValidationException:从客户端检测到具有潜在危险的 Request.Form 值 (wresult="<t:RequestSecurityTo...")。

说明:请求验证检测到潜在危险的客户端输入值,请求的处理已中止。此值可能表示试图破坏您的应用程序的安全性,例如跨站点脚本攻击。要允许页面覆盖应用程序请求验证设置,请将 httpRuntime 配置部分中的 requestValidationMode 属性设置为 requestValidationMode="2.0"。示例:<httpRuntime requestValidationMode="2.0" />。设置此值后,您可以通过在 Page 指令或 <pages> 配置部分中设置 validateRequest="false" 来禁用请求验证。但是,强烈建议您的应用程序在这种情况下明确检查所有输入。有关详细信息,请参阅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 请求)+75 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request, Boolean onPage) +205 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest 请求)+41 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(对象发送者,EventArgs args)+117 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

【问题讨论】:

    标签: asp.net-mvc-3 azure wif acs


    【解决方案1】:

    您可以尝试使用[ValidateInput(false)] 属性(通过将<httpRuntime requestValidationMode="2.0"/> 留在web.config 中)来装饰您要发布到的控制器操作(以及引发此异常的操作)。

    【讨论】:

    • 不走运。在击中控制器之前似乎发生了异常。我将使用堆栈跟踪更新问题。
    【解决方案2】:

    我遇到了同样的问题。

    这是我的解决方案的一个示例:

     [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 中不需要任何东西。

    【讨论】:

      【解决方案3】:

      我在这里写了一篇关于此的小博客笔记:http://erikbra.wordpress.com/2012/04/17/wif-saml-token-post-and-requestvalidationmode2-0/。无需关闭请求验证,或为整个站点将其设置为 2.0。

      简而言之,您只需在 WIF 将 SAML 令牌回发到的特定 URL 上将 requestValidationMode 更改为 2.0 模式。这可以通过 web.config 中的元素(请参阅 location 元素(ASP.NET 设置架构)了解详细信息)来完成,如下所示:

      <location path="WIFHandler">
        <system.web>
          <httpRuntime requestValidationMode="2.0" />
        </system.web>
      </location>
      

      “WIFHandler”位置不需要存在于您的应用程序中,因为 WIF 会在 ASP.NET 尝试处理请求之前缩短管道,并将您重定向到返回 url(wctx 参数中的ru的 SAML 令牌 POST)。

      在 web.config 文件的 WIF 配置部分,确保将“reply”参数与将请求验证模式设置为 2.0 模式的位置匹配:

      <microsoft.identityModel>
          <service>
            <federatedAuthentication>
              <wsFederation passiveRedirectEnabled="true" 
                            issuer="https://localhost/STS/" 
                            realm="https://localhost/MyApp/"
                            reply="https://localhost/MyApp/WIFHandler/" />
      
      (...)
      

      【讨论】:

      • 为我工作。我建议将完整答案放在这里,而不是将答案重定向到您的网站以获取详细信息。
      • 仅供参考,现在将完整答案插入此处 :)
      【解决方案4】:

      首先 - 缩小它的来源。使用 fiddler 调查导致问题的字段。像这样简单的项目:

      【讨论】:

        【解决方案5】:

        将 SampleRequestValidator 从 WIF SDK 复制到项目中并在两个 web.configs 中进行设置

        这应该可以解决它。你能验证代码实际上是在执行吗?如果您在请求验证器中放置一个断点,它会命中吗?

        我假设您将&lt;httpRuntime...&gt; 放在&lt;system.web&gt; 下,对吧?

        【讨论】:

        【解决方案6】:

        我在这里没有看到任何答案提到这一点。就这样吧。

        除了“[ValidateInput(false)]”,在您的 aspx 中,您可能需要将其添加到您的

        <%@ Page ValidateRequest="false">
        

        这将允许在每个页面而不是整个网络应用程序的基础上禁用请求验证。

        【讨论】:

        • 100% 同意,这是绝对需要的 + 这是干净的,因为请求验证仅针对相关页面而不是整个站点被丢弃。感谢分享!
        【解决方案7】:

        我在浏览“从 Active Directory 单点登录到 Windows Azure 应用程序”教程时遇到了这个问题。就我而言,问题是我无意中将&lt;httpRuntime ... /&gt; 值放在了我的web.config 文件中错误的&lt;system.web /&gt; 部分(我最初没有注意到这一点,但有一个新的&lt;location&gt; 部分带有路径也包含 system.web 的“FederationMetadata”)。该值应放在顶级&lt;system.web&gt; 部分中。

        【讨论】:

          【解决方案8】:

          乍一看,它看起来像是 Azure Mvc3 库中的一个错误。 MVC 3 公开了特殊的 API,可让您从 Form 集合中检索未经验证的值,但该模块似乎并未使用它们。

          【讨论】:

            【解决方案9】:

            我无法找到这不起作用的技术原因。但是,从业务需求的角度来看,这是我的特定解决方案所基于的错误示例,因为它在访问任何页面之前提示进行身份验证。然而,对主页的访问必须是匿名的,因此可以使用“登录”按钮。

            相反,我找到了满足这些要求的MVC3 Custom Login Sample,它可以工作。

            【讨论】:

              猜你喜欢
              • 2012-05-29
              • 2012-03-03
              • 2013-11-15
              相关资源
              最近更新 更多