我们正在使用Jasig .NET CAS 客户端与我们组织的 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 停止尝试验证这些类型的请求?我知道我可以完全禁用请求验证,但这是不可能的。带有连字符的网站对此有一个很好的问题,但不是一个真正可以接受的答案:
将以下设置添加到 web.config:
<httpRuntime requestValidationMode="2.0" />
设置此值后,U 可以通过设置 validateRequest="false" 来禁用请求验证
那么,有没有办法在不完全关闭它的情况下禁用此请求的 ASP.NET 验证?
编辑:这也很难调试,因为这个请求来自 CAS 服务器,而不是来自用户的浏览器。我认为这是 CAS 服务器试图通知所有正在运行的应用程序用户已注销(单点注销)。所以我们只在生产中收到这个错误,而不是在本地测试时。