FormsAuthentication.RedirectToLoginPage() not working

本文关键字:not working RedirectToLoginPage FormsAuthentication | 更新日期: 2023-09-27 18:26:07

我是ASP.Net的新手。请解释我需要添加什么。我在登录前点击了这个页面,通过"FormsAuthentication.RRedirectToLoginPage();"将用户带到登录页面。但在page_Load之后,它会转到"dsRequestList_Selecting"。我假设它直接进入登录页面,但出于某种原因,它会在dsRequestList_Selection()之后进入登录页面。我需要做什么?

protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            if (!HttpContext.Current.User.Identity.IsAuthenticated)
            {
                FormsAuthentication.RedirectToLoginPage();
            }
        }
        else
        {
            if (!HttpContext.Current.User.Identity.IsAuthenticated)
            {
                FormsAuthentication.RedirectToLoginPage();
            }
        }
    }
protected void dsRequestList_Selecting(object sender, LinqDataSourceSelectEventArgs e)
    {
       //Selecting
    }

FormsAuthentication.RedirectToLoginPage() not working

不要走这条路。

使用Web.config(或者,对于MVC,使用[Authorize]属性)来保护页面的安全。你不需要这种代码,也不希望它(在每一页中)带来错误的易感性。

你只需要

<configuration>
    <system.web>
       <authorization>
         <deny users="?" /> 
       </authorization>
       ...
    </system.web>
    ....
</configuration>

以确保所有页面与此web.config位于同一文件夹中。loginform自动除外。

尽管已经接受了一个答案,但我还是想添加它来澄清和回答最初的问题。

之所以执行页面上的附加代码,是因为FormsAuthentication.RedirectToLoginPage()的具体工作方式。

从表单身份验证。重定向到登录页面MSDN:

与HttpResponse.RRedirect方法不同,此方法不会通过调用HttpResponce.end来结束请求。这意味着RedirectToLoginPage方法调用之后的代码将运行。

Henk Holterman所说的是准确的,但你不应该在页面本身或理想情况下在代码中处理身份验证(仅仅为了更改访问权限而重新编译是愚蠢的)。他发布的web.config示例就足够了。

此外,我将发布您的代码的修订版本,该版本不允许调用dsRequestList_Selecting,但仍在页面级别处理身份验证(同样,这是未修改的)。

protected void Page_Load(object sender, EventArgs e)
{
    //No need to check IsPostBack if your action is the same either way.
    if (!HttpContext.Current.User.Identity.IsAuthenticated)
    {
        FormsAuthentication.RedirectToLoginPage();
        //Note: Using CompleteRequest() over Response.End() is significantly quicker
        //This is because it avoids raising the ThreadAbortException.
        HttpContext.Current.ApplicationInstance.CompleteRequest();
        //So if you use CompleteRequest(), you want the return statement after.
        //Unless you wrap the rest of the Page_Load logic in an else statement, like the alternate solution below            
        return;
    }
    //All other Page_Load logic
}

另一种更昂贵的方式(由于例外):

protected void Page_Load(object sender, EventArgs e)
{
    if (!HttpContext.Current.User.Identity.IsAuthenticated)
    {
        FormsAuthentication.RedirectToLoginPage();
        Response.End();
    }
    else
    {
        //All other Page_Load logic
    }
}