为什么我会收到“从客户端检测到潜在危险的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
)。
乍一看,它看起来像是Azure Mvc3库中的一个错误。 MVC 3公开了特殊的API,可以从Form集合中检索未验证的值,但该模块似乎并未使用它们。
首先 - 这是从哪里来的狭窄。使用fiddler来调查哪个字段导致问题。简单的项目:< s将在未经编码发布时导致此错误。你也可能想用[AllowHtml]属性装饰你的MODEL,并且尽量不要启用2.0编码 - 这有点危险。
复制从WIF SDK SampleRequestValidator到项目,并在这两个设置web.configs
这应该修复它。你可以验证代码是否正在执行?如果你在请求验证器中放置一个断点,它是否命中?
我假设你把<httpRuntime...>
放在<system.web>
下吧?
有一个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/" />
(...)
为我工作。我建议在此处填写完整答案,而不是将答案重定向到您的网站以获取详细信息。 – 2013-06-03 16:17:46
仅供参考,现在在这里插入完整答案:) – 2013-11-22 15:11:20
我没有看到这里的任何答案都提到这一点所以在这里。
除了“[ValidateInput(false)]”,在你的aspx中,你可能需要把它添加到你的<%@ Page ...>
<%@ Page ValidateRequest="false">
这将允许禁用每个页面的请求验证,而不是整个Web应用程序。
100%同意,这是绝对需要的+这是干净的,因为请求验证只会被丢弃,而不是整个站点。感谢分享! – 2014-08-26 07:44:39
没有运气。在击中控制器之前似乎发生异常。我会用堆栈跟踪来更新这个问题。 – 2011-05-07 07:32:17