在ASP.NET Identity 2 or 3
中,是否可以在班级获取用户信息?场景如下:应用中只有两个角色,即AdminRole
和RegRole
。通过从仅供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();
}
....
答案 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