【问题标题】:Displaying User Information after Authentication in ASP.NET Core在 ASP.NET Core 中验证后显示用户信息
【发布时间】:2019-01-27 21:16:25
【问题描述】:

我已经使用 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 是一个简单的方法,它通过查询数据库返回用户对象(我无法让 UserManager 在这里工作,或者使用 FindByEmailAsync 返回用户,因为它会抛出一个空引用例外)

这是我的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,或者是否也可以通过某些属性这样做?

任何帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net-core asp.net-identity jwt


    【解决方案1】:

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

    不过,其实还有更简单的方法:

    var user = await _userManager.GetUserAsync(User);
    

    【讨论】:

    • 嗨,克里斯,实际上我已经在那里提供了 ID,我在此处手动添加了该注释行而没有粘贴并犯了错误:)。我刚刚尝试使用 GetUserAsync 但仍然出现空引用错误:(但我主要关心的是基于用户显示自定义信息。我是否应该在我想要显示自定义信息的每条受保护路线上从 User.Identity.Name 获取用户 ID给每个用户,或者有没有办法通过使用像[Authorize]这样的属性来做到这一点(授权保护路线,但它无助于根据用户显示自定义)?
    猜你喜欢
    • 2019-05-23
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多