ASP.Net Core 2.1 API JWT 无 cookie 会话?

Posted

技术标签:

【中文标题】ASP.Net Core 2.1 API JWT 无 cookie 会话?【英文标题】:ASP.Net Core 2.1 API JWT cookie-less sessions? 【发布时间】:2019-02-04 01:09:53 【问题描述】:

有这种事吗?这可以做到吗? 有基于 JWT 令牌而不是 cookie 的会话吗? Session.Ids 在每次请求时都会为我更改。 有没有办法知道没有 cookie 的会话?

【问题讨论】:

【参考方案1】:

HTTP 是一种无状态协议。这意味着每个请求都被唯一地对待,就好像客户端以前从未发出过请求一样。会话是一种伪造状态的方式。它们的工作方式是当服务器需要维护状态时,它会创建一个会话并通过 cookie 将该会话的 id 发送给客户端。 cookie 只是一个响应标头,它指示客户端应该保留某条数据,然后在每个后续请求中将其发送回服务器。然后,客户端(Web 浏览器)执行以下操作:保存 cookie 并将 cookie 与每个请求一起发回。服务器在请求标头中接收 cookie,使用它来查找会话并“恢复”它,从而呈现状态。

重要的部分是数据,即会话 ID,不一定是“cookie”。从某种意义上说,这意味着您可以用其他机制替换 cookie,只要客户端和服务器仍然来回传递会话 ID,就可以了。但是,cookie 用于网络浏览器的机制。每次用户导航到不同的页面(发送请求)时,Web 浏览器世界中没有其他东西会自动将数据发送回服务器。如果这是一个涉及通用客户端的 API,而另一端的程序员决定如何格式化每个请求,那么您可以随心所欲地处理它。事实上,API 通常不使用 cookie 正是出于这个原因 - 当您对请求具有完全 控制权时,通常有比来回传递 cookie 更好的方法来做事。这绝对不是网络浏览器的情况,因此传统网站需要 cookie 来维护状态。

JWT 在这个讨论中实际上是无关紧要的。它只是一种格式化数据的方式。它不能替代 cookie。您的 cookie 可能 JWT,并且在许多现代 Web 应用程序中它们实际上是,但服务器仍会发送 Set-Cookie 标头,客户端仍将其保存在本地并使用 @ 将其发送回987654322@标头。

【讨论】:

感谢清理。在这种特殊情况下,我确实可以控制 API 和 Angular 6 客户端。问题是我没有找到有关如何执行此操作的任何文档。我的意思是,我应该将会话 ID 发送到 Angular,然后从那里制作一个 cookie 吗?保存在本地存储中?我应该覆盖默认的 HttpClient 吗?似乎是低级的东西,我认为这种东西已经被比我聪明的人想到并实现了。:) 你能指点我一些文档吗?一些安全方面的最佳实践,一些演示代码?谢谢 我不知道任何具体的内容,但我确定那里有东西。是的,您可以使用本地存储,而不是 cookie。但是,我不确定的部分是将其传输回 ASP.NET Core,它会理解它应该从那里提取会话 ID。老实说,除非您正在处理 GDPR(甚至可能,因为会话存储在很大程度上应该是可选的),否则我只会使用 cookie 的快乐路径。否则,您可能只需要深入研究源代码以了解如何继续。 确实是 Cookie。在您回答之后,我开始使用 Postman 并进行了登录,我看到实际上我在登录响应中得到了一个会话 cookie。 session.id 发生变化的原因是缺少您提到的cookie。我的问题是,默认情况下,angular 不会在请求中存储/发回 cookie。我唯一需要做的事情(对于所有请求)是添加 withCredentials: true 并且 cookie 进入浏览器,现在它被发送到 API 并且会话就在那里!

以上是关于ASP.Net Core 2.1 API JWT 无 cookie 会话?的主要内容,如果未能解决你的问题,请参考以下文章

向 ASP.NET Core 2.1 Web API 添加 JWT 身份验证时是不是需要创建像 AspNetUsers 这样的表?

ASP.NET Core 2.1 Jwt 设置自定义声明

直接从令牌获取 JWT 声明,ASP Net Core 2.1

在 ASP.NET Core 2.1 Web 客户端中存储不记名令牌的位置

在c#asp.net core web api中创建jwt令牌[重复]

ASP.NET Core Web Api之JWT