为什么我会收到“从客户端检测到潜在危险的Request.Form值”错误?

问题描述:

我使用“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值”错误?

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

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

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

我也试过这些变化没有成功。

任何想法?

以下是完整的例外:


异常详细信息: 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 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 

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

相反,我发现MVC3 Custom Login Sample符合这些要求,它的工作原理。

您可以尝试装饰您要发布的控制器操作(以及引发此例外的控制器操作),并使用[ValidateInput(false)]属性(将<httpRuntime requestValidationMode="2.0"/>保留为web.config)。

+0

没有运气。在击中控制器之前似乎发生异常。我会用堆栈跟踪来更新这个问题。 – 2011-05-07 07:32:17

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

首先 - 这是从哪里来的狭窄。使用fiddler来调查哪个字段导致问题。简单的项目:< s将在未经编码发布时导致此错误。你也可能想用[AllowHtml]属性装饰你的MODEL,并且尽量不要启用2.0编码 - 这有点危险。

复制从WIF SDK SampleRequestValidator到项目,并在这两个设置web.configs

这应该修复它。你可以验证代码是否正在执行?如果你在请求验证器中放置一个断点,它是否命中?

我假设你把<httpRuntime...>放在<system.web>下吧?

+0

有一个WIF请求验证器的NuGet包 http://nuget.org/packages/WifRequestValidator/ – webwires 2013-06-27 18:31:33

我有同样的问题。

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

[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什么。

当我通过“从Active Directory到Windows Azure应用程序的单一登录”教程时,我遇到了这个问题。在我的情况下,问题是我无意中将<httpRuntime ... />的值放在我的web.config文件中错误的<system.web />部分(我最初没有注意到这一点,但是有一个新的<location>部分,其路径为“FederationMetadata”,它也包含system.web。)。该值应放置在顶层<system.web>部分。

我在这里写了一个小博客注释:http://erikbra.wordpress.com/2012/04/17/wif-saml-token-post-and-requestvalidationmode2-0/。没有必要关闭请求验证,或者将您的整个网站设置为2.0。

总之,您只需要在WIF回发SAML令牌的特定URL上将requestValidationMode更改为2.0模式。这可以用一个元素(参见location元素(ASP.NET设置架构)了解详细信息)来完成在你的web.config,像这样:

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

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

在web.config文件中的你的WIF配置部分,一定要“回复”参数与你设置请求验证模式2.0模式的位置相符:

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

(...) 
+1

为我工作。我建议在此处填写完整答案,而不是将答案重定向到您的网站以获取详细信息。 – 2013-06-03 16:17:46

+0

仅供参考,现在在这里插入完整答案:) – 2013-11-22 15:11:20

我没有看到这里的任何答案都提到这一点所以在这里。

除了“[ValidateInput(false)]”,在你的aspx中,你可能需要把它添加到你的<%@ Page ...>

<%@ Page ValidateRequest="false"> 

这将允许禁用每个页面的请求验证,而不是整个Web应用程序。

+0

100%同意,这是绝对需要的+这是干净的,因为请求验证只会被丢弃,而不是整个站点。感谢分享! – 2014-08-26 07:44:39