HttpRequestValidationException重定向到登录页面(表单身份验证)

时间:2011-12-21 10:50:02

标签: asp.net forms-authentication validation

在.NET 4.0中,请求验证升级了一个档次!当任何代码尝试访问Request.Form时,似乎验证了表单中的值,并抛出了HttpRequestValidationException。

这本身不应该是一个问题,除了我发现了一个特殊的场景,在这个场景中,ASP.NET本身肯定没有帮我处理这种情况。

我有一个接受HTML输入的表单(我不愿意,但是我确实,好吗?)。此表单的编辑模型在字段上具有[AllowHtml]属性,因此提交HTML很好,不会抛出异常。

但是,如果用户未经过身份验证(例如,他们的会话超时)并且他们尝试提交表单,则在ASP.NET尝试重定向到登录页面时会抛出HttpRequestValidationException。当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验证!

有人对如何克服这个问题有任何想法吗?

2 个答案:

答案 0 :(得分:0)

“&lt; p&gt; Hello&lt; / p&gt;”显然有问题。

您可以在aspx中的Page指令中设置validateRequest =“false”,但这会有效地禁用页面验证,并且可能对服务器/ db有害(可以轻易攻击)。

要避免这种情况,请在将页面发送到服务器之前查找此值的一些JS UrlEncoding,或者在使用它之前禁用页面验证(validateRequest)并处理用户输入 -

string safe = HttpUtility.HtmlEncode(someTextbox.Text);

http://msdn.microsoft.com/en-us/library/ff647397.aspx

答案 1 :(得分:0)

我已经在ASP.NET论坛上发布了这个,看看我们是否能得到回复。 http://forums.asp.net/t/1791239.aspx/1?HttpRequestValidationException+redirecting+to+login+page+forms+authentication+

相关问题