ASP.NET 控制器用户 属性 工作不正常
ASP.NET Controller User property not working correctly
我正在尝试做一些看似很简单的事情。我想要做的就是为我的 Blazor 视图获取当前身份用户的电子邮件地址。我的服务器项目中有一个 UserEmailController
,使用 GetCurrent()
方法 returns 一个 Task<string>
.
public class UserEmailsController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
public UserEmailsController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
[HttpGet]
[Route("api/currentUser")]
public async Task<string> GetCurrent()
{
var user = await _userManager.GetUserAsync(User);
return await _userManager.GetEmailAsync(user);
}
}
从我所做的探索来看,Controller
基地 class 上的 User
属性 似乎应该在用户访问时将信息加载到其中已登录,我应该可以执行类似 await _userManager.GetUserAsync(User)
的操作。但是,当我在这条线上中断时,User
的 Name
属性 是 null
,还有许多其他值。但是 IsAuthenticated
是真的。嗯?
因此,_userManager.GetUserAsync(User)
调用的结果是 null
。
我看过一些关于这个的帖子,有两个共同的主题。
#1 - 人们尝试在控制器的构造函数中使用 User
属性 但它不起作用。建议的解决方案是在 Action 中使用它,这当然是我正在做的。
#2 - 另一个常见的建议是使用 HttpContext.User
,或注入一个 IHttpContextAccessor
(通过 services.AddSingleton...
或 services.AddHttpContextAccessor()
添加)。我已经尝试了所有这些方法并且得到了相同的结果。
我找到了解决方案 。特别是使用 HttpContext.User.FindFirst(ClaimTypes.NameIdentifier)
,然后将其传递给 _userManager.FindByIdAsync(nameId)
。多么迂回的方式,但它确实有效。
我正在尝试做一些看似很简单的事情。我想要做的就是为我的 Blazor 视图获取当前身份用户的电子邮件地址。我的服务器项目中有一个 UserEmailController
,使用 GetCurrent()
方法 returns 一个 Task<string>
.
public class UserEmailsController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
public UserEmailsController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
[HttpGet]
[Route("api/currentUser")]
public async Task<string> GetCurrent()
{
var user = await _userManager.GetUserAsync(User);
return await _userManager.GetEmailAsync(user);
}
}
从我所做的探索来看,Controller
基地 class 上的 User
属性 似乎应该在用户访问时将信息加载到其中已登录,我应该可以执行类似 await _userManager.GetUserAsync(User)
的操作。但是,当我在这条线上中断时,User
的 Name
属性 是 null
,还有许多其他值。但是 IsAuthenticated
是真的。嗯?
因此,_userManager.GetUserAsync(User)
调用的结果是 null
。
我看过一些关于这个的帖子,有两个共同的主题。
#1 - 人们尝试在控制器的构造函数中使用 User
属性 但它不起作用。建议的解决方案是在 Action 中使用它,这当然是我正在做的。
#2 - 另一个常见的建议是使用 HttpContext.User
,或注入一个 IHttpContextAccessor
(通过 services.AddSingleton...
或 services.AddHttpContextAccessor()
添加)。我已经尝试了所有这些方法并且得到了相同的结果。
我找到了解决方案 HttpContext.User.FindFirst(ClaimTypes.NameIdentifier)
,然后将其传递给 _userManager.FindByIdAsync(nameId)
。多么迂回的方式,但它确实有效。