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

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

如果用户已登录,它将从数据库中获取用户的信息,否则,“TheUser”对象将为空。

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

我正在查看自定义授权filter,但那些不允许我创建“TheUser”对象并将其存储在ViewData中。

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

[Authorize] public class HomeController : Controller { User TheUser; public HomeController() { TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null; ViewData["TheUser"] = TheUser; } } 

我创建了一个自定义基本Controller类,并为其添加了“CurrentUser”属性。

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

我让我的控制器inheritance了自定义基类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; } } 

我使用constuctor方法以类似的方式设置我的基本控制器,并且我能够在以下mannner上阅读此用户信息。 注意:我只存储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); } } 
 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; } } 

是否必须为每个Controller操作或仅特定操作实例化用户?

如果创建ActionFilterAttribute,则可以访问Controller上下文。 不确定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); } } 

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