Где хранить данные пользователя после входа в систему с помощью WebForms

Я разрабатываю веб-приложение WebForms с VS2010 в C#. Я использую свой пользовательский подход входа для аутентификации пользователей, и я не хочу использовать структуру членства. После входа в систему я хочу сохранить данные пользователя как идентификатор пользователя, имя пользователя,фамилию, адрес электронной почты и т. д. так я могу получить к ним доступ во время сессии пользователя на всех страницах.

как я могу это сделать? Я не хочу хранить пользовательские данные в UserData свойства FormsAuthenticationTicket.

Я нашел такой подход: должен ли я хранить пользовательские данные в сеансе или использовать пользовательский поставщик профилей?, но я не понимаю как это реализовать.

у меня есть некоторые вопросы:
1) на моей странице входа для аутентификации пользователя после проверки учетных данных в БД я использую : FormsAuthentication.SetAuthCookie(txtUserName.Значение, true); теперь на моей странице по умолчанию у меня есть:
FormsAuthenticationTicket ticket = ((FormsIdentity)(пользователь.Идентичность.))Билет; и я использую билет.Имя для отображения имени пользователя. правильно ли это? почему вы говорите о потоке, используя Нить.CurrentPrincipal.Идентичности.Имя ?
2) у меня есть этот код в global.файл asax для чтения ролей пользователей и хранения их в HttpContext:

void Application_AuthenticateRequest (отправитель объекта, EventArgs e) {

    if (Request.IsAuthenticated) {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLConnStr"].ConnectionString);
        conn.Open();

        SqlCommand cmd = new SqlCommand("SELECT Gruppi.Name FROM Ruoli INNER JOIN Gruppi ON Ruoli.GroupID = Gruppi.GroupID INNER JOIN Utenti ON Ruoli.UserID = Utenti.UserID AND Utenti.Username=@UserName", conn);      
        cmd.Parameters.AddWithValue("@UserName", User.Identity.Name);
        SqlDataReader reader = cmd.ExecuteReader();
        ArrayList rolelist = new ArrayList();         
        while (reader.Read()){
            rolelist.Add(reader["Name"]);
        }
          //  roleList.Add(reader("Name"))           
        string[] roleListArray = (string[])rolelist.ToArray(typeof(string));
        HttpContext.Current.User = new GenericPrincipal(User.Identity, roleListArray);

        reader.Close();
        conn.Close();
    }

}

могу ли я хранить пользовательские данные в сеансе, как вы написали из моего глобального.asax файл, а не логин.aspx-страницы?

3 ответов


в интересах более легкой отладки я предлагаю использовать шаблон дизайна фасада сеанса,описано здесь, что позволит вам хранить данные текущего пользователя с помощью HttpContext.Current.Session объект более организованным образом.

например, будет файл (например,SessionFacade.cs), который отвечает за обработку значений, переданных в / из Session; в вашем случае, это может выглядеть так:

public static class SessionFacade
{
    public static int UserId
    {
        get {
            if (HttpContext.Current.Session["UserId"] == null)
                HttpContext.Current.Session["UserId"] = 0;
            return (int)HttpContext.Current.Session["UserId"];
        }
        set {
            HttpContext.Current.Session["UserId"] = value;
        }
    }
    // ... and so on for your other variables
}

затем, где-то еще в вашем коде, как только вы проверите что полномочия в порядке, вы можете сделать...

if (credentialsAreOk) {
    SessionFacade.UserId = /* insert ID here */
    // ...
}

...вместо того, чтобы вручную назначать значения объекту сеанса. Это гарантирует ваши переменные в Session имеют правильный тип и будет легче отслеживать во время отладки. Затем, чтобы получить UserId из любой точки вашей программы, это просто SessionFacade.UserId.

(да, этот фрагмент был из ответа Эдуарда; вы все равно должны изучить этот ответ, поскольку он информативен о том, как работают WebForms; просто имейте в виду, что вызов Session объект вручную в вашем коде может быть довольно грязным и что фасад сеанса делает этот процесс чище)


в случае, если "веб-приложение VS2010 в C#" вы говорите о ASP.NET (MVC или Classic) и "пользовательский подход для входа" вы имеете в виду FormsAuthentication тогда все, что вам нужно сделать, это сохранить позже необходимую информацию во время входа в систему, на сессии


членство provider помогает вам хранить данные, а также для целей аутентификации. Что-то вроде этого:-

Session["UserName"] = Membership.GetUser().UserName