如何在C#AspNetCore网站中使用JWT JSON Web令牌?

时间:2017-08-02 14:47:23

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

我正在尝试将使用JWT进行登录的网站整合在一起。我的问题是我不明白网站应该如何使用JWT。

我的想法是将我的单片架构分成:

  • 用于身份验证和颁发JWT的IdentityServer。
  • 具有受基于JWT角色保护的端点的ApplicationServer API。
  • 从IdentityServer请求JWT的前端应用程序和网站,并使用它们访问ApplicationServer上的数据。

这将允许我为许多项目使用一个IdentityServer,并可能将前端开发用于第三方,并允许我专注于应用程序API详细信息。

我已经构建了IdentityServer。它可以使用用户名/密码,验证并发出访问令牌和刷新令牌。超。 访问令牌是短暂的且不安全的,并且旨在定期刷新。目的是将其存储在客户端,即应用程序或网页。 刷新令牌的寿命较长,并且旨在安全存储。在网站上,这将存储在服务器端,并存储在应用程序中,存储在“会话”持续时间的安全存储中。

我有一个前端网站shell设置了一些测试操作。必须对用户进行身份验证才能访问它们,其中经过身份验证意味着拥有有效的访问令牌。

  • 当用户最初访问某个操作时,他们没有令牌。
  • 前端网络服务器应将其重定向到登录页面,并请求凭据(用户名和密码)。
  • 网络服务器将凭据转发给IdentityServer,如果凭据有效,则应返回访问权限并将令牌刷新到网络服务器。
  • 网络服务器将缓存刷新令牌并将访问令牌发送回网页。
  • 然后,客户端网页将缓存访问令牌,并在每次进一步的页面请求时发送该令牌。
  • 网络服务器将解码访问令牌,如有必要可能会刷新它,并使用更新的访问令牌发送回页面。
  • 当一个请求进入过时的访问令牌并且刷新令牌已经过了足够的时间并且用户被重定向到登录页面时,会话(会话)结束。

关于如何将访问令牌返回到网页,我有点迷失。

此外,我不明白网页如何自动附加每个请求的令牌(如果有的话),或者网页如何响应401挑战(如果没有)。

Cookie是将数据附加到HTTP对话的唯一方法,并在导航期间将其保留在客户端吗?

JWT是纯粹用于最初提供页面的SinglePageApps(SPA),然后所有后续数据都由Ajax处理(我可以设置标题没问题)?

或者,是否可以编写网页,以便它们始终使用访问令牌填充Authorization标头(如果存在)?

我意识到我可能认为自己陷入困境,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

您应该阅读Auth0的资源所有者密码授权 https://auth0.com/docs/api-auth/grant/password

文档

我会将刷新令牌和访问令牌放在客户端上。

我的方法是。

客户知道它没有访问令牌 - >显示登录按钮。 点击登录按钮 - >使用登录页面重定向到身份验证服务器。它包括状态/代码和回调网址。 客户端从用户接收回调并将其视为登录的客户端。 客户端将访问令牌和刷新令牌(如果提供)存储在localstorage中。 然后它将访问令牌传递给它想要访问的api的请求。 API检查访问令牌是否适合它并且是否有效,允许授权并完成请求。 API没有刷新令牌的任何知识。

希望有所帮助