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

Oma*_*mar 8 c# asp.net-mvc authorization

对于我将要与用户帐户进行交互的操作,我想创建一个"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;  
    }
}
Run Code Online (Sandbox Code Playgroud)

Oma*_*mar 16

我创建了一个自定义的基本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;                
    }
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*lay 5

我使用构造函数方法以类似的方式设置了我的基本控制器,并且能够通过以下方式读取此用户信息。注意:我只存储 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)