我已经用JWT令牌实现了Identity,并使用[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,还是可以通过某些属性来实现?
任何帮助将不胜感激。
答案 0 :(得分:0)
使用UserManager
失败的原因是,您试图通过id(FindByIdAsync
)来获取用户,但是提供了用户名作为“ id”。那将永远不会匹配,因此不会返回任何用户,并且您的变量为null。如果您只使用FindByNameAsync
,就可以了。
但是,实际上有一种更简单的方法:
var user = await _userManager.GetUserAsync(User);