【问题标题】:When users log out using CAS SSO, ASP.NET MVC triggers a HttpRequestValidationException当用户使用 CAS SSO 注销时,ASP.NET MVC 会触发 HttpRequestValidationException
【发布时间】:2012-08-09 02:10:05
【问题描述】:

我们正在使用Jasig .NET CAS Client 与我们组织的 CAS SSO 服务器进行交互。

但是,我们注意到在 ASP.NET MVC 3(我认为这也会影响 ASP.NET WebForms)应用程序中,当用户注销时,我们会在错误日志中看到以下错误:

System.Web.HttpRequestValidationException (0x80004005):
A potentially dangerous Request.Form value was detected from the client
(logoutRequest="<samlp:LogoutRequest...").
  at System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection)
  at System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection)
  at System.Web.HttpRequest.get_Form()
  at System.Web.HttpRequest.FillInParamsCollection()
  at System.Web.HttpRequest.GetParams()
  at DotNetCasClient.Utils.RequestEvaluator.GetRequestIsCasSingleSignOut() in C:\Projects\Jasig\CAS\dotnet-client\trunk\DotNetCasClient\Utils\RequestEvaluator.cs:line 292
  at DotNetCasClient.CasAuthenticationModule.OnBeginRequest(Object sender, EventArgs e) in C:\Projects\Jasig\CAS\dotnet-client\trunk\DotNetCasClient\CasAuthenticationModule.cs:line 93
  at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
  at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

我不认为这是用户收到的错误消息——它似乎只有服务器才能看到。就用户而言,注销是成功的。

有什么方法可以让 ASP.NET MVC 停止尝试验证这些类型的请求?我知道我可以完全禁用请求验证,但这是不可能的。 The site with a hyphen 对此有一个很好的问题,但不是一个真正可以接受的答案:

将以下设置添加到 web.config:

&lt;httpRuntime requestValidationMode="2.0" /&gt;

设置此值后,U 可以通过设置 validateRequest="false" 来禁用请求验证

那么,有什么方法可以在不完全关闭的情况下禁用对此请求的 ASP.NET 验证?

编辑:这也很难调试,因为这个请求来自 CAS 服务器,而不是来自用户的浏览器。我认为这是 CAS 服务器试图通知所有正在运行的应用程序用户已注销(单次注销)。所以我们只在生产中收到此错误,而不是在本地测试时收到。

【问题讨论】:

    标签: asp.net asp.net-mvc iis-7 cas request-validation


    【解决方案1】:

    dotnetcas 客户端在访问 MVC 控制器操作之前获得对请求的访问权限,因此无法简单地在 MVC 控制器或操作上设置验证属性。

    此请求的目标似乎是最后一个经过验证的 URL,因此也无法使用此方法禁用对应用程序中特定路径的验证:http://erikbra.wordpress.com/2012/04/17/wif-saml-token-post-and-requestvalidationmode2-0/

    据我所知,您有几个选择:

    禁用此验证:

    <system.web>
      <httpRuntime  requestValidationMode="2.0" />
    </system.web>
    

    .Net 4.5 允许您在请求通过验证之前访问它。如果您有权访问它,您可以从源代码重新编译客户端,修复相关问题。

    【讨论】:

    • .Net 4.5 方法听起来不错。也许我们将能够利用该技术并将修复提交给 DotNetCAS 人员。感谢您的帮助!
    • 不幸的是,.Net 4.5 并不适合所有人。我们最终只是关闭了验证,因为任何人想要绕过任何人都是微不足道的。见:quotium.com/research/advisories/XSS-NetRequestValidation.php
    【解决方案2】:

    我不熟悉 Jasig .NET CAS,但 ASP.NET MVC 允许您页面级别禁用请求验证

    将以下属性添加到您的控制器操作:

    [ValidateInput(false)]
    

    【讨论】:

    • 我想使这个问题复杂化的是我什至不确定正在执行什么操作。我们的记录器只是将 URL 显示为我们应用的根目录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2017-11-07
    • 2016-04-27
    • 1970-01-01
    相关资源
    最近更新 更多