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

Ale*_*gas 21 azure wif acs asp.net-mvc-3

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

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

  • 设置<httpRuntime requestValidationMode="2.0"/><pages validateRequest="false">在根web.config和Views\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

Dar*_*rov 18

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


小智 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*]

         //.... 
    }
Run Code Online (Sandbox Code Playgroud)

您的webconfig中不需要任何内容​​.


Eri*_*oen 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中的元素(请参阅位置元素(ASP.NET设置架构)获取详细信息)来完成,如下所示:

<location path="WIFHandler">
  <system.web>
    <httpRuntime requestValidationMode="2.0" />
  </system.web>
</location>
Run Code Online (Sandbox Code Playgroud)

该"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/" />

(...)
Run Code Online (Sandbox Code Playgroud)


Ale*_*gas -1

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

相反,我找到了满足这些要求并且有效的MVC3 自定义登录示例。