如何在ASP.NET Core Identity中的控制器的构造函数中获取登录的用户名



我正在使用asp.net core 1.1和身份3.0。我正在尝试访问 controller constructor中用户登录名的登录名。但是我得到了NullReferenceException。但是,我可以在控制器的任何操作方法中获取用户名,如下所示。问题:如何在控制器的构造函数中获取用户名,以便可以在控制器的任何操作方法中使用它。似乎我可能必须为此进行某种依赖注入(但这只是一个猜测)。

public class TestController : Controller
{
    private ProjNameContext _context;
    string selUser = "";
    public TestController(ProjNameContext context)
    {
        _context = context;
        selUser = User.Identity.Name; //Here I get error: Object reference not set to an instance of an object.
    }
    [HttpGet]
    public IActionResult TestAction()
    {
        selUser = User.Identity.Name; //Here the user name (login name) is not null
       .....
    }
    ....
}

简而言之,您不能在构造函数(至少不是直接)中这样做,因为它在请求生命周期中还为时过早。您可以使用将值注入某个地方的属性(也许是ViewData,但我不确定这在核心中是否有效),但是如果真正的目标只是缓存用户名以后以供以后使用,那么我只会创建一种可以做到这一点的方法。您甚至可以将其放入基本控制器类中,以在项目中的任何操作中使用。例如:

public class BaseController : Controller
{
    private string _username;
    protected string Username
    {
        get
        {
            if (_username == null)
            {
                _username = User.Identity.Name;
            }
            return _username;
        }
    }
}

现在,只需使您的控制器从中继承,您就可以自动访问此属性。例如:

public class TestController : BaseController
                            //^^^^^^^^^^^^^^
{
    private ProjNameContext _context;
    public TestController(ProjNameContext context)
    {
        _context = context;
    }
    [HttpGet]
    public IActionResult TestAction()
    {
        Now you don't need to cache the username yourself as it's done for you.
        var username = Username;
        //Do something with username
    }
}

您可以使用基本控制器,您可以在其中编写自己的方法来登录用户用户名。

public class BaseControler : Controller
{
    public string GetUsername()
    {
        if (User != null)
        {
            return User.Identity.Name;
        }
        else if (System.Web.HttpContext.Current.User != null)
        {
            return System.Web.HttpContext.Current.User.Identity.Name;
        }
        return string.Empty;
    }
}

然后在您的实际控制器中继承了基本控制器,您可以在构造函数中获取用户名。

public class MyController: BaseController
{
    private string username;
    public MyController()
    {
        username = GetUsername();
    }
}

最新更新