2010-11-26 1 views
1

Каков наилучший образец, который вы видели или использовали для доступа к текущему зарегистрированному пользователю в приложении Asp.NET?Ваш любимый «текущий пользовательский» -патент для приложений Asp.net?

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

Требования:

  • Работа красиво как в MVC и WebForms.
  • Образец должен иметь возможность работать с классами членства aspnet или собственными классами, являющимися «пользователями». .
  • Четкие и очевидный способ решения, когда не вошли в систему
+4

И что не так со встроенными поставщиками членства/роли? – Josh 2010-11-26 15:54:16

+0

С ними ничего плохого. Я использую их много. Но это как получить доступ к пользовательским объектам, будь то членские объекты или пользовательские объекты, что является вопросом. :) – 2010-11-26 16:17:25

ответ

2

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

В моем контроллере счета:

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 переходящего в моем объекте пользователя/модели, которую я прочитал из базы данных.

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

var user = AccountController.GetUserFromSession(); 

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

Нет беспорядка. Не суетись.

2

Я на самом деле очень доволен тем, что уже встроенный в 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. 
} 
+0

Я вижу, но он не решает требования для доступа к пользовательскому объекту пользователя. – 2010-11-26 16:15:45

 Смежные вопросы

  • Нет связанных вопросов^_^