我有一个中间类,为我需要身份验证的所有页面扩展System.Web.UI.Page。该课程主要进行自定义身份验证处理。
当访问权限不足的用户尝试访问某个页面时,我会尝试将用户重定向回登录页面,同时阻止执行任何其他页面事件(即Page_load)。想到的第一个解决方案是Response.Redirect的默认实现。当然,这样做的缺点是抛出ThreadAbortExceptions的可能性。
所以我的问题是这样的:在页面生命周期中(如果有的话)实际上安全地执行Response.Redirect()而没有抛出ThreadAbortException?
public class CustomPage : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (!IsValid())
Response.Redirect("login.aspx", true);
}
}
答案 0 :(得分:5)
如果您将true作为第二个参数传递,它永远不会“安全” - 它将始终抛出异常。在内部,Response.Redirect()
调用Response.End()
,直接中止当前线程。
在没有抛出异常的情况下截断HttpRequest
的唯一“安全”方法是使用HttpApplication.CompleteRequest()
,但这会导致当前请求中的代码执行进一步发生。
答案 1 :(得分:1)
好奇,你为什么要自己这样做?如果有的话,你应该使用其中一个身份验证提供程序(最终,可以自定义FormsAuthentication来处理几乎你能想到的任何场景)。
然后,您可以使用web.config文件中的authorization element来指示匿名用户无法访问哪些页面/目录。 ASP.NET将负责其余工作,将用户重定向到您指定的登录页面,以及在用户登录时重定向。
答案 2 :(得分:0)
如果您不想要ThreadAbort异常,则应将False传递给endResponse参数。当然这意味着你必须处理页面的其余部分,这很难做到。
除非你做了像锁定一样非常愚蠢的事情,否则在ASP.NET页面中抛出ThreadAbort异常是完全安全的。
另一种选择是使用Server.Transfer。这比重定向具有更好的性能,但它也使用ThreadAbort异常。