【发布时间】: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