Определение пользователя с User.Identity.Name в конструкторе контроллера - PullRequest
8 голосов
/ 21 августа 2009

Для моих действий, которые будут взаимодействовать с учетной записью пользователя, я хотел бы создать объект "TheUser" в дополнение к добавлению этого объекта в "ViewData [" TheUser "]", как только какое-либо действие на моем контроллере будет выполнено называется.

Если пользователь вошел в систему, он будет извлекать информацию о пользователе из базы данных, в противном случае объект "TheUser" будет просто нулевым.

Я попытался получить доступ к «User.Identity.Name» в конструкторе контроллера, но он не был создан до вызова какого-либо действия.

Я просматривал пользовательские фильтры авторизации, но они не позволили бы мне создать объект "TheUser" и сохранить его в ViewData.

Это краткий фрагмент того, чего я хотел бы достичь:

[Authorize]
public class HomeController : Controller
{
    User TheUser;

    public HomeController()
    {
        TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null;

        ViewData["TheUser"] = TheUser;  
    }
}

Ответы [ 4 ]

15 голосов
/ 27 сентября 2009

Я создал собственный базовый класс Controller и добавил к нему свойство «CurrentUser».

В методе Initialize я поместил логику для получения пользователя, а затем добавил ее в ViewData и свойство CurrentUser контроллера.

Мои контроллеры унаследовали пользовательский базовый класс Controller, и я смог ссылаться на переменную «CurrentUser» в любом месте контроллера:

public class CustomControllerClass : Controller
{
    public User CurrentUser { get; set; }

    protected override void Initialize(RequestContext requestContext)
    {
        base.Initialize(requestContext);

        if (requestContext.HttpContext.User.Identity.IsAuthenticated)
        {
            string userName = requestContext.HttpContext.User.Identity.Name;
            CurrentUser = UserRepository.GetUser(userName);
        }

        ViewData["CurrentUser"] = CurrentUser;                
    }
}
4 голосов
/ 20 февраля 2010

Я настроил свой базовый контроллер аналогичным образом, используя метод constuctor, и я смог прочитать эту информацию о пользователе следующим образом. Примечание. Я храню только UserId, а не объект User, но смысл моего кода - показать, как вы можете получить необходимую информацию в методе contriuctor.

public abstract class BaseController : Controller
{
    int _UserId = 0;

    public int UserId
    {
        get { return _UserId; }
        set { _UserId = value; }
    }

    public BaseController()
    {
        var userFromAuthCookie = System.Threading.Thread.CurrentPrincipal;

        if (userFromAuthCookie != null  && userFromAuthCookie.Identity.IsAuthenticated) // && !String.IsNullOrEmpty(userFromAuthCookie.Identity.Name))
        {
            busUser userBO = AceFactory.GetUser();
            string userNameFromAuthCookie = userFromAuthCookie.Identity.Name;
            _UserId = userBO.GetUserIdByUsername(userNameFromAuthCookie);
        }
    }
3 голосов
/ 18 ноября 2010
public abstract class YourController : Controller
{
    public YourController()
    {
        var user = System.Threading.Thread.CurrentPrincipal;

        TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(user.Identity.Name) : null;

        ViewData["TheUser"] = TheUser;  
    }
}
1 голос
/ 21 августа 2009

Должен ли пользователь быть создан для каждого действия контроллера или только для определенных?

Если вы создаете ActionFilterAttribute, у вас есть доступ к контексту контроллера. Не уверен, верно ли это для AuthorizationFilters, но вы можете попробовать что-то вроде этого:

public class MyCustomFilter: ActionFilterAttribute
{

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Controller.ViewData["TheUser"] = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null;
        base.OnActionExecuting(filterContext);
    }
}

Затем присоедините это к необходимым действиям контроллера.

...