Могу ли я хранить переменные сеанса для каждого пользователя в файле Global.asax? - PullRequest
1 голос
/ 31 августа 2011

У меня есть приложение asp.net c #.Я использую аутентификацию веб-форм.Я хотел бы, чтобы пользователь вошел в систему или зарегистрировался на веб-сайте, чтобы написать свою информацию в сеансе, например:

  • идентификатор пользователя, адрес электронной почты, имя, телефон, адрес и т. Д.Использую также аутентификацию openid.

    Как я вижу, сеанс может быть сохранен с главной страницы или файла Global.asax.В моем случае у меня есть 3 разные главные страницы, и я хотел бы сохранить и удалить переменные сеанса пользователя из одного места.

    Также это должно быть безопасно.В любом случае, в какой момент жизненного цикла приложения лучше хранить переменные сеанса, уникальные для каждого пользователя?Лучшие практики

Ответы [ 5 ]

2 голосов
/ 31 августа 2011

Я предложу что-то другое:

Унаследуйте все свои страницы от BasePage. В этой BasePage создайте пользовательское свойство, что-то вроде этого:

 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... 
}
0 голосов
/ 31 августа 2011

Я думаю, я бы переопределил класс Page и добавил туда код управления сеансом, а затем заставил бы каждую из главных страниц наследовать пользовательский класс вместо Page.

0 голосов
/ 31 августа 2011

Вы можете использовать метод Application_BeginRequest в файле Global.asax.

В этом методе вы можете получить доступ к "this.Session" и делать все, что захотите.

0 голосов
/ 31 августа 2011

Вы можете сделать это от того, кого хотите, я бы предложил вам следующее:

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;
}
}

Итак, если вы хотите, чтобы идентификатор текущего пользователя был указан SessionData.User.UserID.

PS: я извиняюсь за статический класс ^^

0 голосов
/ 31 августа 2011

Если нет другого способа получить доступ к экземпляру Session, кроме как через HttpContext.Current, из global.asax, то это не будет работать - поскольку вы не можете получить доступ к текущему контексту из области действия этого кода , (Вы можете получить к нему доступ напрямую, поскольку HttpApplication предоставляет Session, но в этой области есть некоторые оговорки.)

Вы можете, однако, определить четвертую главную страницу, которая будет действовать как корень, и выполнить общий код, который использует сеанс, а затем получить каждый из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...