23

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

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

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

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

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

有任何想法吗?

这是完整的例外:


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

说明:请求验证检测到潜在危险的客户端输入值,请求的处理已中止。此值可能表示试图破坏您的应用程序的安全性,例如跨站点脚本攻击。要允许页面覆盖应用程序请求验证设置,请将 httpRuntime 配置部分中的 requestValidationMode 属性设置为 requestValidationMode="2.0"。示例:<httpRuntime requestValidationMode="2.0" /><pages>设置此值后,您可以通过在 Page 指令或配置部分中设置 validateRequest="false" 来禁用请求验证。但是,强烈建议您的应用程序在这种情况下明确检查所有输入。有关详细信息,请参阅http://go.microsoft。

堆栈跟踪:

[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

4

9 回答 9

19

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

于 2011-05-07T07:24:29.787 回答
16

我有同样的问题。

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

 [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 中不需要任何内容​​。

于 2011-11-07T21:12:14.973 回答
13

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

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

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

“WIFHandler”位置不需要存在于您的应用程序中,因为 WIF 将在 ASP.NET 尝试处理请求之前缩短管道,并将您重定向到返回 url(ruwctxSAML 令牌 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/" />

(...)
于 2012-04-17T19:04:23.453 回答
2

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

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

我假设你把<httpRuntime...>权利<system.web>

于 2011-05-07T16:35:31.350 回答
2

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

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

<%@ Page ValidateRequest="false">

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

于 2013-10-30T08:47:15.627 回答
2

首先 - 缩小它的来源。使用 fiddler 调查导致问题的字段。像这样简单的项目: <s 在未编码的情况下发布时会导致此错误。此外,您可能想用 [AllowHtml] 属性装饰您的模型,并尽量不要启用 2.0 编码 - 这有点危险。

于 2011-05-07T16:12:27.093 回答
1

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

于 2011-12-07T18:40:21.027 回答
0

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

于 2011-05-07T16:10:06.627 回答
-1

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

相反,我找到了满足这些要求的MVC3 自定义登录示例并且它可以工作。

于 2011-05-08T20:28:53.780 回答