В .NET 4.0 проверка запросов была на ступеньку выше! Кажется, когда какой-либо код пытается получить доступ к Request.Form, значения в форме проверяются, и генерируется исключение HttpRequestValidationException.
Само по себе это не должно быть проблемой, за исключением того, что я обнаружил особый сценарий, когда сам ASP.NET определенно не оказывает мне никакой помощи в решении этой ситуации.
У меня есть форма, которая принимает ввод HTML (я бы не хотел, но я согласен, хорошо?). Модель редактирования для этой формы имеет атрибут [AllowHtml]
в поле, поэтому отправка HTML не вызывает сложностей.
Однако, если пользователь не прошел проверку подлинности (например, истек тайм-аут его сеанса), и он пытается отправить форму, возникает исключение HttpRequestValidationException, когда ASP.NET пытается перенаправить на страницу входа. Исключение выдается, когда ASP.NET проверяет, является ли запрос запросом AJAX или нет, и в этот момент он пытается получить доступ к полю формы.
Трассировка стека:
[HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (LongDescription="<p>Hello</p>").]
System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +8855748
System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection) +122
System.Web.HttpRequest.get_Form() +150
System.Web.HttpRequestWrapper.get_Form() +11
System.Web.UI.PageRequestManager.IsAsyncPostBackRequest(HttpRequestBase request) +223
System.Web.Handlers.ScriptModule.HttpResponse_Redirecting(Object sender, EventArgs e) +82
System.Web.HttpResponse.Redirect(String url, Boolean endResponse, Boolean permanent) +394
System.Web.Security.FormsAuthenticationModule.OnLeave(Object source, EventArgs eventArgs) +9044409
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
Оскорбляющие строки кода в System.Web.UI.PageRequestManager.IsAsyncPostBackRequest
:
// DevDiv Bugs 188713: X-MicrosoftAjax header is stripped by some firewalls
string asyncPost = request.Form[AsyncPostFormField];
return !String.IsNullOrEmpty(asyncPost) && (asyncPost.Trim() == "true");
Все, что я хотел бы, - это чтобы он успешно перенаправил на страницу входа в этом сценарии. Я также не хочу отключать проверку .NET 4.0!
Кто-нибудь получил какие-либо идеи о том, как преодолеть эту проблему?