将凭据/令牌保存在 cookie 中?
Posted
技术标签:
【中文标题】将凭据/令牌保存在 cookie 中?【英文标题】:Saving credentials / token in a cookie? 【发布时间】:2013-07-10 21:35:26 【问题描述】:我已经设法进行身份验证,我知道它会向客户端返回一个令牌 (JWT)。这个令牌有一个过期日期/时间,所以我正在考虑将令牌保存在 cookie 中,以便将来的登录通过身份验证,但这可能不起作用。
然后我想将用户名和密码保存在 cookie 中,尽管我知道不推荐这样做??
目前我有一个接受用户名和密码的表单,成功登录将提供一个用于访问其他端点的令牌。
表单需要包含“记住我”,以便自动登录。
实现这一目标的最佳方法是什么?
我是否应该将用户名和密码存储在 cookie 中,如果不是,我如何在用户下次访问我的站点时自动进行身份验证。我提供的令牌即将过期,所以存储它有什么意义吗?
提前致谢
【问题讨论】:
您最终将 JWT cookie 或服务器端会话保存在哪里?你能回复一下吗? 【参考方案1】:不要将用户名或密码存储在 cookie 中。即使 cookie 是加密的,最好在 cookie 中存储像令牌这样的过期时间短的凭证,而不是保存期限更长的密码这样的凭证。
即使在 ASP.NET Web 窗体或 MVC 世界(窗体身份验证)中,“记住我”通常只在 cookie 过期之前有效。 “记住我”并不意味着永远记住我,记住必须有一个有限的时间段。该时间可以从 cookie 中得出。您可以将 JWT 放入 cookie 中,并将 cookie 的生命周期设置为与 JWT 相同,例如一个小时。当用户在这段时间内回到您的应用程序时,cookie 不会过期,用户会自动登录。否则,他们必须重新登录。不要考虑存储用户名 - 密码并系统地登录。让用户输入凭据,这种方法会更安全。顺便说一句,请确保 cookie 已加密并且是仅 HTTP 的 cookie。
此机制类似于表单身份验证。您将使用 JWT 代替身份验证票证。您需要拥有自己的 HttpModule 或消息处理程序来执行此操作并为请求建立身份,而不是 FAM 读取 cookie。
【讨论】:
感谢您的反馈。所以我想我只会将令牌存储在cookie中。然后,我可以有一个端点来再次验证令牌,以防它过期。使用令牌使 cookie 过期的通常长度是多少。谷歌 gmail 似乎永远登录?令牌过期后自动更新令牌以免中断不是一个好习惯吗?即不再登录? 我认为没有任何关于到期限制的经验法则。这取决于您的业务需求。顺便说一句,基于 OAuth 2.0 授权代码的授权具有刷新令牌,可用于无缝获取新的访问令牌而无需询问用户凭据,但仅适用于服务器端,并且由于涉及风险而禁止客户端使用。您必须基本上考虑提供无缝登录与安全体验的超愉快体验。如果我需要在几个小时内登录一次,我会接受,因为我的凭据存储在浏览器可以控制的地方。 Oauth 2 规范建议到期时间不超过 10 分钟 (rfc6749)。 OAuth 2 安全最佳实践规范——以及大多数标识提供者——建议不要将访问令牌放入 cookie,甚至是仅 HTTP cookie,或浏览器中的任何持久存储机制中。还建议不要将 JWT 用于会话。本文总结了前端应用的令牌存储:medium.com/@benjamin.botto/…【参考方案2】:Google 的身份验证 cookie 有效期为 14 天。
http://ben.onfabrik.com/posts/dog-fooding-our-api-authentication
【讨论】:
感谢您的链接,这正是我正在使用的框架。我没有意识到谷歌的有效期只有 14 天...... 所以14天后应该不会有任何自动重新登录。应该过期了,应该强制用户重新登录? 这是你的决定;)我认为 14 天是有意义的(对于谷歌)。以上是关于将凭据/令牌保存在 cookie 中?的主要内容,如果未能解决你的问题,请参考以下文章
FCM 推送 - 请求具有无效的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据
请求具有无效的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据 automl
为啥浏览器不以保存 cookie 的方式保存 JWT 令牌?
如果用于身份验证的 JWT 令牌保存在 HTTP-Only cookie 中,您如何从 cookie 中读取它以便我可以将其包含在请求标头中?
IdentityServer4 - 刷新令牌混合流程 - Cookie 和存储
如何使用.Net Core cookie中间件ticketdataformat将Jwt令牌从Api保存到c#中的cookie