在核心 ASP.NET 中显示身份验证后的用户信息



我已经使用 JWT 令牌实现了身份,并使用[Authorize]属性保护了路由。这很好用。有几个关于使用 JWT 和 Identity 保护路由的教程,但我找不到任何关于如何让特定用户在经过身份验证后仅访问自己的内容的教程。

到目前为止,我已经做到了这一点:

[Authorize]
[HttpGet("protected")]
public async Task<string> ProtectedArea()
{
var userName = User.Identity.Name;
var user = repository.GetUserByEmail(userName);
//var user2 = _userManager.FindByIdAsync(userName); //user2.id gives null reference error
return User.Bio;
}

在这里,GetUserByEmail一个简单的方法,它通过查询数据库返回 User 对象(我无法让UserManager在这里工作,也不能使用FindByEmailAsync返回 User,因为它会抛出空引用异常(

这是我的claims的样子:

var claims = new List<Claim>
{
new Claim(JwtRegisteredClaimNames.Sub, email),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName),
new Claim(JwtRegisteredClaimNames.NameId, user.Id.ToString())
};

那么,从令牌中识别用户然后继续显示该用户信息的标准方法是什么?我上面所做的对我来说似乎有点笨拙,但这是正确的方法吗?另外,我是否需要对每个路由执行检查并通过方法获取用户 ID,或者也可以通过某些属性执行此操作?

任何帮助将不胜感激。

使用UserManager失败的原因是您尝试通过 id (FindByIdAsync( 获取用户,但提供用户名作为"id"。这将永远不会匹配,因此不会返回任何用户并且您的变量为 null。如果你只是用FindByNameAsync代替,你会没事的。

但是,实际上还有一种更简单的方法:

var user = await _userManager.GetUserAsync(User);

最新更新