在我的基本Controller构造函数上获取用户标识

Hug*_*rio 7 asp.net-membership c#-4.0 asp.net-mvc-4 .net-4.5

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

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

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

谢谢

Row*_*man 9

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

处理这些情况的最佳方法是使用动作过滤器.该授权属性是早期解雇,很可能是适合您的情况.

首先,让我们创建一个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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

[MyClassAuthorization]
public class BaseController : Controller
{
    protected MyClass Foo
    {
        get { return (MyClass)ViewData["MyClassInstance"]; }
    }
}
Run Code Online (Sandbox Code Playgroud)