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

标签 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对此有一个很好的问题,但不是一个真正可以接受的答案:

add the following setting to the web.config:

<httpRuntime requestValidationMode="2.0" />

After setting this value, U can disable request validation by setting validateRequest="false"

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

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

最佳答案

dotnetcas 客户端在到达 MVC Controller 操作之前访问请求,因此不可能简单地在 MVC Controller 或操作上设置验证属性。

此请求的目标似乎是最后一个经过验证的 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 允许您在请求通过验证之前访问它。如果您有权访问它,您可以从源代码重新编译客户端,修复相关问题。

关于asp.net - 当用户使用 CAS SSO 注销时,ASP.NET MVC 触发 HttpRequestValidationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11924274/

相关文章:

asp.net-mvc - 指定的 LINQ 表达式包含对与不同上下文关联的查询的引用

jquery - 每行多列的 DropDownList

.net - 如何使用Powershell和Web管理提供程序导出IIS7站点和应用程序池设置?

c# - 我可以在我的 Site.Master 页面 MVC 上继承一些东西吗?

asp.net - Facebook Connect 登录按钮未呈现

c# - 使用 SqlBulkCopy 在 asp.net 中上传 Excel 文件

c# - MVC 模型验证中的变量

c# - ASP.NET - Comet 将消息从服​​务器推送到所有客户端

.net - 如何以编程方式配置 IIS7? (不使用元数据库)

windows - IIS 应用程序池标识与 Windows 帐户