Ваш любимый "текущий пользователь" -шаблон для приложений Asp.net? - PullRequest
1 голос
/ 26 ноября 2010

Какой самый красивый шаблон вы видели или использовали для доступа к текущему вошедшему в систему пользователю в приложении Asp.NET?

Текущий пользователь относится к бизнес-объекту, который представляет пользователя в вашей системе, будь то объект пользователя членства или пользовательский класс. Пользовательский объект должен быть легко доступен в таких местах, как глобальные (объект httpapplication), веб-формы, контроллеры, веб-обработчики и т. Д. Он, вероятно, отправляется на внутренние уровни проекта и иногда внедряется в другие бизнес-объекты в зависимости от ваше приложение.

Требования:

  • Прекрасно работает как в MVC, так и в веб-формах.
  • Шаблон должен быть в состоянии работать либо с классами членства в aspnet, либо с собственными классами, являющимися "пользователями".
  • Ясный и очевидный способ борьбы, когда вы не вошли в систему.

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

Вот что я делаю, чтобы сохранить объект вместо имени, которое я считаю менее полезным.

В моем контроллере аккаунта:

    public static User CacheUserInSession(User user)
    {
        Contract.Assert(user != null);

        if (user == null) // Not found, name may have changed
        {
            new FormsAuthenticationService().SignOut();
        }
        else
        {
            // Save off the user for later use by other classes
            ContextCache<User>.Set(user, ContextCache.AspNetUserSessionCache);
            ContextCache<int>.Set(user.RowId, ContextCache.UserIdSessionCache);
        }

        return user;
    }

    public static User GetUserFromSession()
    {
        var user = ContextCache<User>.Get(ContextCache.AspNetUserSessionCache);

        return user;
    }

Мой класс кеша:

public class ContextCache<T>
{    
    public static void Set(T objectToCache, string key)
    {
        System.Web.HttpContext.Current.Items.Add(key, objectToCache);
    }

    public static T Get(string key)
    {
        return (T)System.Web.HttpContext.Current.Items[key];
    }

}

Я вызываю CacheUserInSession из Application_AuthenticateRequest, передавая мой объект / модель User, который я читаю из базы данных.

Когда я хочу получить пользователя, я делаю этот вызов:

var user = AccountController.GetUserFromSession();

Используя обертку кеша, вы можете сохранять / извлекать любые объекты, которые вам нужны.

Нет беспорядка. Без суеты.

2 голосов
/ 26 ноября 2010

Я на самом деле вполне доволен тем, что уже встроено в ASP.NET:

if (User.Identity.IsAuthenticated)
{
    string currentlyLoggedUsername = User.Identity.Name;
    // TODO: Now given this username you could query your repository
    // or the Membership provider to fetch additional user information.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...