【问题标题】:ASP.NET Controller User property not working correctlyASP.NET 控制器用户属性无法正常工作
【发布时间】:2022-01-06 00:17:00
【问题描述】:

我正在尝试做一些看似非常简单的事情。我要做的就是为我的 Blazor 视图获取当前身份用户的电子邮件地址。我的服务器项目中有一个UserEmailController,带有一个返回Task<string>GetCurrent() 方法。

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 基类上的User 属性应该在用户登录时将信息加载到其中,我应该能够执行类似@ 的操作987654327@。但是,当我打破这一行时,UserName 属性是null,以及许多其他值。但是IsAuthenticated 是真的。嗯?

所以,_userManager.GetUserAsync(User) 调用的结果是null

我看过一些关于这个的帖子,有两个共同的主题。

#1 - 人们尝试在控制器的构造函数中使用User 属性,但它不起作用。建议的解决方案是在 Action 中使用它,这当然是我正在做的。

#2 - 另一个常见的建议是使用HttpContext.User,或注入IHttpContextAccessor(通过services.AddSingleton...services.AddHttpContextAccessor() 添加)。我已经尝试了所有这些方法,并且得到了相同的结果。

【问题讨论】:

    标签: asp.net-core asp.net-identity blazor .net-6.0


    【解决方案1】:

    我找到了解决方案here。具体使用HttpContext.User.FindFirst(ClaimTypes.NameIdentifier),然后将其传递给_userManager.FindByIdAsync(nameId)。这是一种迂回的方式,但它确实有效。

    【讨论】:

      猜你喜欢
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多