【问题标题】:C# and ASP.NET Core 6 : authentication and user details in "session"C# 和 ASP.NET Core 6:“会话”中的身份验证和用户详细信息
【发布时间】:2022-01-27 02:44:41
【问题描述】:

我要为这个买这么多“好的爷爷” cmets。

我已经阅读了十几篇文章以及我能找到的关于这个主题的每一个 SO 问题。

我一定是离开太久或完全错过了什么,因为我发誓用户身份验证过去非常简单。我似乎记得服务器上的内置方法和会话只是通过 cookie 或类似方式知道用户是谁,并能够“在会话中”存储信息。我什至不记得在过去几年中设置过身份验证,它只是内置在新应用程序中。

相反,the most succinct guide I could find 非常投入。我认为我需要一个令牌授权/身份验证设置,因为这些天可能有些消费者(如应用程序)没有典型的 cookie 模式。在我看来,令牌就像 cookie 一样工作,只是它是手动保存在用户端并通过每个请求的标头传递的?

值得称赞的是,该指南有效,至少在登录和正确使用控制器中的简单 Authorize 属性方面。但是,User.Identity.Name 始终为空,即使 User.Identity.IsAuthenticated 为 true,这很令人费解。

我认为身份验证的工作方式:

  • 用户请求使用用户名/密码访问 API
  • 服务检查组合,并将加密的 JWT 返回给用户
  • 用户在每次请求时都将 JWT 发回
  • 服务器解密此 JWT 以识别用户 - 这可能是我错了

所以这就是我的问题所在:

我需要有关用户的更多数据,例如每次请求都可以访问整个UserModel,但我不想每次都去数据库查找它。这是我认为内存中应该只有一个会话对象的地方,但令牌身份验证似乎不是这种情况。


TL;DR:

如果用户在 Authorization 标头中使用 JWT 而不是 cookie 标识,我应该将用户特定的短期(“会话”)信息放在哪里以供将来使用?

  • Session state 不对,因为它是硬连线到 cookie 的
  • HttpContext.Items 不对,因为它只是为了一个请求
  • Cache 存储不正确,因为它不是特定于用户/会话的。我可能会在这里创建一个类似会话的用户键控存储,但这似乎有点过度设计了。
  • 基本上我将所有数据(不仅仅是用户标识符)传递给客户端然后依赖客户端将其传回的任何事情似乎都是错误的?但请随时纠正我。

【问题讨论】:

  • JWT 身份验证令牌与状态是分开的。它实际上是一个安全的用户标识符令牌。如果服务器仍然发回会话状态 cookie,则应用正常的 cookie 会话状态。并且无需直接使用 cookie,只需使用安全的用户标识符,就可以实现面向用户的状态(这实际上就是将用户绑定信息保存到数据库中......);无论如何,可以创建自定义“会话”状态提供程序。
  • 您是否将项目的身份验证设置为 Windows 或匿名?确保没有使用匿名。
  • JWT 是基于声明的;我可能是错的,但在您的链接中,他们似乎在创建时将声明添加到令牌中。如果您可以填充声明,它们将在那里并且可以在您的受保护端点中访问。

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


【解决方案1】:

服务器解密这个JWT来识别用户这大概是 我哪里错了

JWT 令牌未加密,已签名,因此您无法更改它。例如,如果您查看 jwt.io,您可以打开它。

我应该将用户特定的短期(“会话”)信息放在哪里? 在未来请求中使用 JWT 标识用户的消费 在授权标头而不是 cookie 中?

你把它放在令牌的原则声明中。在您链接的指南中写道:

  var claims = new List<Claim>
  {
       new Claim(JwtRegisteredClaimNames.NameId, user.UserName)
  };

因此,您可以将任何您想要的内容添加到声明中以将其存储在令牌中,然后您可以通过以下方式访问这些数据:

var claim = _contextAccessor.HttpContext.User?.Claims.FirstOrDefault(d =>
                    d.Type == ClaimTypes.NameIdentifier);

您也不能使用您列出的任何其他示例,例如HttpContext.Items,因为这些示例未签名。如果令牌以任何方式被更改,系统会识别并返回 401

【讨论】:

    猜你喜欢
    • 2011-02-05
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 2012-09-15
    • 2019-07-15
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多