Когда пользователи выходят из системы с помощью CAS SSO, ASP.NET MVC вызывает HttpRequestValidationException
Мы используем Jasig .NET CAS Client для взаимодействия с 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, пытающийся уведомить все запущенные приложения о том, что пользователь вышел из системы (единый выход). Таким образом, мы получаем эту ошибку только при производстве, а не при локальном тестировании.
2 ответа
Клиент 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 позволяет получить доступ к запросу до его проверки. Если у вас есть доступ к этому, вы можете перекомпилировать клиент из исходного кода, исправив соответствующую проблему.
Я не знаком с Jasig .NET CAS, но ASP.NET MVC позволяет отключить проверку запросов на уровне страниц.
Добавьте следующий атрибут в действие вашего контроллера:
[ValidateInput(false)]