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) 的操作。但是,当我在这条线上中断时,UserName 属性 是 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)。多么迂回的方式,但它确实有效。