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

如何在C#AspNetCore网站中使用JWT JSON Web令牌?,c#,authentication,asp.net-core,jwt,C#,Authentication,Asp.net Core,Jwt,我正在尝试整合一个使用JWTs登录的网站。我的问题是,我不明白一个网站应该如何使用JWTs 我们的想法是将我的整体架构分为: 用于身份验证和颁发JWT的标识服务器 具有受基于JWT的角色保护的端点的ApplicationServer API 前端应用程序和网站从IdentityServer请求JWT,并使用它们访问ApplicationServer上的数据 这将允许我在许多项目中使用一个IdentityServer,并可能将前端开发外包给第三方,并允许我专注于应用程序API的细节 我已生成I

我正在尝试整合一个使用JWTs登录的网站。我的问题是,我不明白一个网站应该如何使用JWTs

我们的想法是将我的整体架构分为:

  • 用于身份验证和颁发JWT的标识服务器
  • 具有受基于JWT的角色保护的端点的ApplicationServer API
  • 前端应用程序和网站从IdentityServer请求JWT,并使用它们访问ApplicationServer上的数据
这将允许我在许多项目中使用一个IdentityServer,并可能将前端开发外包给第三方,并允许我专注于应用程序API的细节

我已生成IdentityServer。它可以获取用户名/密码、验证并发出访问令牌和刷新令牌。超级的。 访问令牌是短期的、不安全的,并且打算定期刷新。其目的是将其存储在客户端,无论是应用程序还是网页。 刷新令牌的使用寿命更长,并且可以安全地存储。在网站上,这将存储在服务器端,并存储在应用程序中,在“会话”期间存储在安全存储中

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

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

此外,我不理解网页如何在每个请求中自动附加令牌(如果有),或者如果没有,网页如何响应401质询

cookie是将数据附加到HTTP会话并在导航期间在客户端持久化的唯一方法吗

JWTs是否纯粹用于SinglePageApps(SPA),其中最初提供一个页面,然后所有后续数据都由Ajax处理(在这里我可以设置标题,没有问题)

或者,是否可以编写网页,使其始终使用访问令牌(如果存在)填充授权标头


我意识到,我可能认为自己陷入了困境,如果有任何帮助,我将不胜感激。

您应该阅读Auth0关于资源所有者密码授予的文档。

我会将刷新令牌和访问令牌一起保存在客户端上

我的方法是

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


希望有帮助

我相信您的令牌应该存储在web请求头中。每一个请求都有它,它允许挑战。在每次通话中,验证访问权限。而不是cookie,虽然这是一个选项。是的,我不明白的是如何从客户端获取每个请求,以包括授权标头。为什么不能手动添加标头,并在每个请求上添加授权、承载和提供的令牌值
request.Headers.Add(“authorization”,$“bearer={token}”)。类似的东西?这是JavaScript在客户端吗?客户端如何知道填充此标头?如果我很愚蠢,我会道歉。如果一个应用程序正在配置一个Http请求,或者如果请求是Ajax,我完全明白这是如何工作的,但是如果用户键入URL或通过链接导航到另一个页面,那么请求如何包含标题?我猜只有Cookie才能做到这一点,但我认为JWTs将取代Cookie。这是一种C#风格的方法,但从Ajax或Axios中,您可以操纵头:
$.Ajax({headers:{'authorization','bearer='+token})。我现在已经实现了这一点,并且学到了更多。我将刷新令牌保存在服务器上的RAM查找缓存中。我将客户端上的访问令牌保存在cookie中。在cookie中检查所有请求的访问令牌,如果失效,则使用刷新令牌获取新的访问令牌(如果刷新令牌失效,则再次登录)。然后,客户端可以访问其他操作或页面并拥有cookie,但不公开刷新令牌。访问令牌绑定到IP地址和用户代理。Cookie是HTTPOnly,HTTPS是所有东西。