6

我对 .NET 很陌生 - 我正在制作一个网站,其中包含一个只有登录用户才能看到的管理部分。我已经创建了登录代码,一旦用户通过身份验证,我就会为他们分配一个会话变量。我的问题是:有没有更有效的方法来检查会话变量,而不是在每个页面上都有以下功能?

protected void Page_Load(object sender, EventArgs e)
{
      checkSession();

 }
public void checkSession()
{
    if (Session["LoggedIn"] != "true")
    {
        Response.Redirect("default.aspx");
    }
}

非常感谢!

4

9 回答 9

6

如果您使用的是 a MasterPage,则可以将检查代码放入MasterPage's Page_Load事件中,如果不使用 theGlobal.asax或自定义HttpModule,则将检查代码放入第AcquireRequestState一个事件PostRequestHandlerExecute处理程序和第二个事件处理程序中

以 Global.asax 为例

public class Global : System.Web.HttpApplication
{ ...
    void Application_AcquireRequestState(object sender, EventArgs e)
    {            
        HttpContext context = HttpContext.Current;
        // CheckSession() inlined
        if (context.Session["LoggedIn"] != "true")
        {
          context.Response.Redirect("default.aspx");
        }
    }
  ...
}
于 2013-03-27T15:25:37.093 回答
3

您可能应该考虑使用表单身份验证:
http ://www.asp.net/web-forms/videos/authentication/using-basic-forms-authentication-in-aspnet

您可以将页面或文件夹配置为始终需要授权,因此运行时将处理该要求,而不必手动检查。

于 2013-03-27T15:24:22.243 回答
2

从派生自 Page 的自定义类派生您的页面

通过添加会话检查代码来覆盖 Load 方法

现在你所有的页面都有验证

public class MyPage : System.Web.UI.Page
 protected void Page_Load(object sender, EventArgs e)
 {
   if (Session["yoursession"] != "true")
   {
     //code
   }
 }



public class yourCustomPage1 : MyPage
{   
 protected void Page_Load(object sender, EventArgs e)
 {
   //you don't have to check or call any method..
 }
}

public class yourCustomPage2 : MyPage
{   
 protected void Page_Load(object sender, EventArgs e)
 {
   //you don't have to check or call any method..
 }
}

ETC...

于 2013-03-27T15:23:26.073 回答
2

您可以使您的页面成为一个继承自检查登录用户的基类的类。

于 2013-03-27T15:24:07.367 回答
1

开始了解 ASP.Net 中的表单身份验证的一个好方法是创建一个全新的网站。进入 Visual Studio 并创建新项目,选择 Web,然后选择 ASP.NET Web 应用程序。在 Account 文件夹中查看它以了解流程和 ASP.Net 方法。

于 2013-03-27T15:25:07.033 回答
1

您可以创建 BasePage 并从此基本页面继承您的所有页面,在您的基本页面中设置功能。

public class BasePage : Page
{
   protected void checkSession()
   {
    if (Session["LoggedIn"] != "true")
    {
        Response.Redirect("default.aspx");
    }
   }
}

您的页面

public partial class YourPage : BasePage
{
....
}

另一个解决方案:

在您的 Http 模块中,创建 Principal(Roles) 和 Identity 以设置身份验证和授权功能,在您的 http 模块中将这些信息附加到当前线程。

链接:http: //msdn.microsoft.com/en-us/library/system.security.principal.iidentity.isauthenticated.aspx

于 2013-03-27T15:25:29.940 回答
0
            public class BasePage : Page
            {
             protected void checkSession()
               {
                  if (Session["LoggedIn"] == null)
                   {
                           Response.Redirect("~/default.aspx/");
                    }
               }
            }
于 2014-03-21T11:00:07.757 回答
0

第一种方式:Global.asax.cs 添加

    void Application_AcquireRequestState(object sender, EventArgs e)
    {
        HttpContext context = HttpContext.Current;
        Page page = context.Handler as Page;

        if ((string)context.Session["LoggedIn"] != "true"
            && !(page.AppRelativeVirtualPath == "~/Default.aspx"))
            context.Response.Redirect("default.aspx");
    }

第二种方式:您可以在母版页中进行相同的会话管理。页面加载事件。

希望这可以帮助。

于 2017-08-24T10:58:34.240 回答
0

您可以在 GLOBAL.asax.cs 中添加此代码,这将检查会话是否为空,并且如果此请求是从登录页面初始化的,它也不会重定向,否则它将陷入循环。

 void Application_AcquireRequestState(object sender, EventArgs e)
    {
        HttpContext context = HttpContext.Current;
        // CheckSession() inlined
        if (Context.Request.Url.LocalPath != "/UIComponents/User/Login.aspx")
        {
            if (context.Session["Name"] == null)
            {
                FormsAuthentication.RedirectToLoginPage();
            }
        }
    }
于 2019-03-04T11:59:09.920 回答