在ASP.NET标识中获取类级别的用户信息

时间:2017-07-03 15:58:57

标签: c# asp.net-core asp.net-core-mvc asp.net-core-identity

ASP.NET Identity 2 or 3中,是否可以在班级获取用户信息?场景如下:应用中只有两个角色,即AdminRoleRegRole。通过从仅供AdminRole用户使用的下拉列表中选择用户名,AdminRole中的用户可以充当UserRole中的用户。我需要做的是,如果管理员从主页的下拉列表中选择用户,我需要将所选用户的名称分配给类(即控制器)级别变量,以便可以在所有用户名上使用Controller的动作方法(一个类)。我尝试了以下操作,但它在下面代码的if (User.Identity.Name == "Admin")行抛出NullException:

  

NullReferenceException:未将对象引用设置为对象的实例。

家庭控制器 [管理员从下拉列表中选择用户名]

public class HomeController : Controller
{
    ...
    [HttpPost]
    public IActionResult ChooseUser(string selectedUser)
    {
        HttpContext.Session.SetString(SessionKeySelUser, selectedUser);

        return View();
    }
}

其他控制器 [我想在以下控制器的所有操作方法中使用上面选定的用户名]

public class TestController : Controller
{
   private MyProjContext _context;
   private string _userName;

  public TestController (MyProjContext context)
  {
    _context = context;

    if (User.Identity.Name == "Admin")
        _userName = HttpContext.Session.GetString("selectedUser"); //This session variable was assigned the user name value when the admin had selected the user name from the dropdown on the home page
   }
}

//use the class level variable _userName in all action methods like the one below
public IActionResult TestAction()
{
    _context.Orders.Where(ord => ord.Seller == _userName);

    return View();
}

....

1 个答案:

答案 0 :(得分:0)

如果您使用Identity 3,则必须获取UserManager的实例才能获取当前登录的用户。

您可以使用UserManager获取iOC的实例,然后使用GetUserAsync的{​​{1}}方法获取当前的用户对象模型。

UserManager

您的情况可以改为:

protected readonly UserManager<AppUser> UserManager;
private Task<AppUser> GetCurrentUserAsync() => UserManager.GetUserAsync(HttpContext.User);

public TestController(UserManager<AppUser> userManager)
{
     UserManager = userManager;
}

由于您尝试从构造函数访问它,因此可以在前面添加var curUser = await GetCurrentUserAsync(); if (curUser.Name == "Admin") _userName = HttpContext.Session.GetString("selectedUser"); //This session variable was assigned the user name value when the admin had selected the user name from the dropdown on the home page 以使其同步。正如您在注释中报告的那样,在构造类时,控制器的HttpContext为null。不过,您可以从IHttpContextAccessor访问它。

Result

如果您使用public TestController(UserManager<AppUser> userManager, IHttpContextAccessor httpContextAccessor) { UserManager = userManager; var curUser = UserManager.GetUserAsync(httpContextAccessor.HttpContext.User).Result; if (curUser.Name == "Admin") _userName = HttpContext.Session.GetString("selectedUser"); } ,我相信Identity会被注入管道。如果它返回null,则必须将其添加为IHttpContextAccessor类中的单例。

Startup