7

我在我的 ASP.NET MVC4 网站上有一个基本控制器,它有一个简单的构造函数:

public class BaseController : Controller
{
    protected MyClass Foo { get; set; }
    public BaseController()
    {
        if (User.Identity.IsAuthenticated))
        {
            Foo = new MyClass();
        }
    }
}

但是我无法访问User这里。是null。但在我继承的控制器上它很好。

谢谢

4

2 回答 2

9

控制器实例化将在授权发生之前发生。即使您的 MVC 应用程序调用RenderAction()多次并且您最终创建了五个不同的控制器,这五个控制器将在任何OnAuthorization发生之前创建。

处理这些情况的最佳方法是使用动作过滤器Authorize 属性会提前触发,可能很适合您的情况。

首先,让我们创建一个AuthorizationFilter

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyClassAuthorizationAttribute : Attribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Controller.ViewData["MyClassInstance"] = new MyClass();
        }
    }
}

现在让我们更新我们的控制器

[MyClassAuthorization]
public class BaseController : Controller
{
    protected MyClass Foo
    {
        get { return (MyClass)ViewData["MyClassInstance"]; }
    }
}
于 2013-10-07T23:57:39.687 回答
4

在这种情况下,我将覆盖 Controller Initialize 方法

protected override void Initialize(RequestContext requestContext)
{
   base.Initialize(requestContext);
   // User.Identity is accessible here
}
于 2017-06-16T23:14:15.330 回答