代码之家  ›  专栏  ›  技术社区  ›  Omar

在控制器构造函数中定义具有User.Identity.Name的用户

  •  8
  • Omar  · 技术社区  · 16 年前

    对于要与用户帐户交互的操作,我希望在调用控制器上的任何操作时,除了将该对象添加到“ViewData[“TheUser”]”之外,还创建一个“TheUser”对象。

    我尝试访问控制器构造函数中的“User.Identity.Name”,但在调用任何操作之前都没有创建它。

    这是我想完成的一个简短片段:

    [Authorize]
    public class HomeController : Controller
    {
        User TheUser;
    
        public HomeController()
        {
            TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null;
    
            ViewData["TheUser"] = TheUser;  
        }
    }
    
    4 回复  |  直到 13 年前
        1
  •  17
  •   Omar    9 年前

    在Initialize方法中,我放置了获取用户的逻辑,然后将其添加到ViewData和控制器的“CurrentUser”属性中。

    我让我的控制器继承自定义基本控制器类,并且我能够在控制器中的任何位置引用“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;                
        }
    }
    
        2
  •  5
  •   MattSlay    14 年前

    我使用constructor方法以类似的方式设置我的基本控制器,并且我能够在下面的mannner上读取此用户信息。注意:我只存储UserId,而不是User对象,但我的代码的目的是展示如何在contactor方法中获得所需的信息。

    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
  •  3
  •   Martin    15 年前
    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;  
        }
    }
    
        4
  •  2
  •   JoshJordan    16 年前

    是否必须为每个控制器操作实例化用户,还是仅为特定的操作实例化用户?

    如果创建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);
        }
    }
    

    然后,将其附加到必要的控制器操作。