Как я могу ссылаться на свою собственную таблицу с помощью свойства MVC Controller.User? - PullRequest
2 голосов
/ 23 ноября 2010

С провайдером членства по умолчанию для проектов MVC 2 я могу ссылаться на User.Identity.UserName согласно тому, что он создает по умолчанию.Я не хочу этого делать - хочу использовать свои собственные таблицы.Итак, я реализовал класс System.Web.Security.MembershipProvider.Единственное, что я реализовал, как и во многих постах в Интернете и SO, это ValidateUser(string username, string password)

. Я легко вижу, что это принимает строки с именами пользователей и паролями, я получаю доступ к контексту своей базы данных (на самом деле LINQ to Entitiesпровайдер dotConnect для MySQL) и проверьте имя пользователя и пароль - достаточно просто.

Но как я могу заставить объект Controller.User использовать свойства моей собственной таблицы.Например, мой стол называется Staff.У него есть StaffID (PK), FirstName, LastName и т. Д. Как я могу получить доступ к StaffID текущего контекстного пользователя следующим образом?

int id = User.StaffID;

Я нашел это сообщение от Мэтта Врока, но не могуимеет смысл реализовать класс User, в частности метод IsInRole.Когда создается этот объект и откуда берутся аргументы конструктора?

Ответы [ 2 ]

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

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

Создайте базовый контроллер и наследуйте от него все ваши контроллеры.

В базовом контроллере добавьте свойство с именем CurrentUser любого типа, который вы хотите использовать (возможно, типа Linq 2 Sql).

Переопределите метод Initialize на базовом контроллере и запустите логику, чтобы получить правильного пользователя, если пользователь аутентифицирован. Установите CurrentUser для соответствующего пользователя. Теперь у вас есть доступ к этому свойству в любом контроллере, который наследуется от вашего базового контроллера.

public BaseController : Controller
{
     public MyUserEntity CurrentUser {get; set;}

     protected override void Initialize(RequestContext requestContext)
     {
            CurrentUser = null;
            if (requestContext.HttpContext.User.Identity.IsAuthenticated)
            {
                var userRepository = new UserRepository();
                CurrentUser = userRepository.GetUser(requestContext.HttpContext.User.Identity.Name);
            }

     }

}

И использовать его:

public StaffController : BaseController
{
      public ActionResult View()
      {
           var staffRepository = new StaffRepository();
           var staff = staffRepository(CurrentUser.StaffID);
           return View(staff);
      }
}
1 голос
/ 24 ноября 2010

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

вам нужно определить свой собственный класс, который происходит от

GenericIdentity

Далее вам нужно определить свой собственный класс, который происходит от

GenericPrincipal

Этот класс может иметь свойства, на которые вы хотите сослаться (например, StaffID).

Затем вам нужно подключиться к фактическому процессу аутентификации и назначить экземпляр вашего потомка GenericPrincipal свойству «User».

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

((MyPrincipal)User).StaffID

Это немного больше работы по сравнению с тем, что вам приходилось делать до сих пор.

Но это выполнимо.

...