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

C# 在控制器构造函数中定义具有User.Identity.Name的用户,c#,asp.net-mvc,authorization,C#,Asp.net Mvc,Authorization,对于要与用户帐户交互的操作,我希望在调用控制器上的任何操作时,除了将该对象添加到“ViewData[“TheUser”]”之外,还创建一个“TheUser”对象 如果用户登录,它将从数据库中获取用户信息,否则,“TheUser”对象将为null 我尝试访问控制器构造函数中的“User.Identity.Name”,但在调用任何操作之前都没有创建它 我正在查看自定义授权过滤器,但这些过滤器不允许我创建“TheUser”对象并将其存储在ViewData中 这是我想完成的一个简短片段: [Author

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

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

我尝试访问控制器构造函数中的“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;  
    }
}

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

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

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

我创建了一个自定义基本控制器类,并向其添加了一个“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;                
    }
}

我使用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);
        }
    }

用户可以在每次操作中使用它。让我困惑的是,尽管[Authorize]确保用户经过身份验证,但我没有访问user.Identity的权限,但我可以访问ViewData。当我从BaseController继承控制器时,我的所有web请求在执行BaseController的Execute方法后停止,而不转到Action方法。我在浏览器中看到一个空白页。我们还有什么要做的吗?Puneet,请看我的编辑。我最初的答案是ASP.NETMVC1。我更新了它以覆盖
Initialize
方法,因为在MVC2和3中,这是一个可以接受的地方,非常感谢您,我真的很感激。找了很长时间,你的答案很简洁。我还尝试使用user.Identity-
System.Threading.Thread.CurrentPrincipal
返回用户,为我修复了它-非常感谢这个答案对MVC3帮助很大
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;  
    }
}