对于我将要与用户帐户进行交互的操作,我想创建一个“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;
}
}
答案 0 :(得分:15)
我创建了一个自定义基类Controller类,并为其添加了“CurrentUser”属性。
在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;
}
}
答案 1 :(得分:4)
我使用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);
}
}
答案 2 :(得分:3)
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;
}
}
答案 3 :(得分:1)
用户是否必须针对每个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);
}
}
然后,将其附加到必要的控制器操作。