我可以在Global.asax文件中为每个用户存储会话变量吗?

时间:2011-08-31 13:17:43

标签: c# asp.net webforms

我有一个asp.net c#应用程序。我正在使用Web表单身份验证。我想在用户登录或注册网站后立即在会话中写下他的信息,例如:

  • UserId,电子邮件,姓名,电话,地址等

我也在使用openid身份验证。

我认为会话可以从母版页或Global.asax文件中保存。在我的情况下,我有3个不同的母版页,我想从一个地方保存和删除用户会话变量。

此外,它必须是安全的。无论如何,在应用程序生命周期的哪个阶段更好地存储每个用户唯一的会话变量?最佳实践

5 个答案:

答案 0 :(得分:2)

我会建议不同的东西:

从BasePage继承所有页面。 在该BasePage中创建一个User Property,如下所示:

 public class BasePage : System.Web.UI.Page
 {
    public WebUser CurrentUser
    {
        get 
        {
            WebUser currentUser = HttpContext.Current.Session["WHATEVERKEY"] as WebUser;

            if (currentUser == null)
            {
               currentUser = new WebUser();//and do some processing
               HttpContext.Current.Session["WHATEVERKEY"] = currentUser;
            }
            return currentUser;
        }
        set 
        { 
            HttpContext.Current.Session["WHATEVERKEY"]=value;
        }
    }
 }

用户通过身份验证后,您只需执行以下操作即可存储用户信息:

this.Page.CurrentUser = userAuthenticated;

您可以在应用程序的所有页面中访问此CurrentUser。

WebUser类可能如下所示:

[Serializable]
public class WebUser
{

   public string Name {get;set;}
   public string Email {get;set;}
   // and so on... 
}

答案 1 :(得分:0)

除非有另一种方法可以从global.asax中通过Session访问HttpContext.Current实例,否则这将无效 - 因为您无法访问当前上下文这段代码的范围。 (您可以直接访问它,因为HttpApplication会公开Session,但此区域有一些警告。)

但是,您可以定义第四个母版页作为根并执行利用会话的通用代码,然后从每个母版派生一个。

答案 2 :(得分:0)

您可以在Global.asax文件中使用Application_BeginRequest方法。

在该方法中,您可以访问“this.Session”并执行您喜欢的任何操作。

答案 3 :(得分:0)

你可以从你想要的那样做,我建议你:

public class User{

int UserID;
string Email;
string Name;
string Phone;
string Address
}

public static class SessionData{
 static User User{
get{
return (User)HttpContext.Current.Session["user"];
}
set{
HttpContext.Current.Session["user"] = value;
}
 static bool  IsUserConnected{
get{
return HttpContext.Current.Session["user"]  != null;
}
}

因此,如果您想要当前用户的ID,请执行SessionData.User.UserID。

PS:我对静态类^^

感到沮丧

答案 4 :(得分:0)

我想我会覆盖Page类并在那里添加会话管理代码,然后让每个母版页继承自定义类而不是Page