当用户使用CAS SSO注销时,ASP.NET MVC会触发HttpRequestValidationException

时间:2012-08-12 17:32:34

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

我们正在使用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:

     

<httpRuntime requestValidationMode="2.0" />

     

设置此值后,U可以通过设置validateRequest =“false”

来禁用请求验证

那么,是否有办法在不完全关闭此请求的情况下禁用ASP.NET验证?

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

2 个答案:

答案 0 :(得分:6)

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

此请求的目标似乎是经过验证的最后一个网址,因此无法使用此方法禁用应用程序中特定路径的验证: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允许您在进行验证之前访问请求。如果您有权访问此内容,则可以从源代码重新编译客户端,修复相关问题。

答案 1 :(得分:0)

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

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

[ValidateInput(false)]