c# - 如何在 C# AspNetCore 网站中使用 JWT JSON Web Tokens?

标签 c# authentication asp.net-core jwt

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

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

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

这将允许我将一个 IdentityServer 用于多个项目,并可能将前端开发委托(delegate)给第 3 方,并允许我专注于应用程序 API 细节。

我已经构建了 IdentityServer。它可以获取用户名/密码、验证并颁发访问 token 和刷新 token 。极好的。 访问 token 是短暂的且不安全的,并且旨在定期刷新。目的是将其存储在客户端,应用程序或网页。 刷新 token 生命周期较长,旨在安全存储。在网站上,这将存储在服务器端,而在应用程序中,则在“ session ”期间存储在安全存储中。

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

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

对于如何将访问 token 返回到网页,我有点迷茫。

此外,我不明白如果网页有一个 token ,网页如何自动为每个请求附加一个 token ,或者网页如何在没有 token 的情况下响应 401 质询。

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

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

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

我意识到我可能以为自己陷入了困境,我们将不胜感激。

最佳答案

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

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

我的方法是。

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

希望对你有帮助

关于c# - 如何在 C# AspNetCore 网站中使用 JWT JSON Web Tokens?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45464076/

相关文章:

c# - 页面加载需要很长时间

web-services - 如何在 Delphi 中处理安全 Web 服务的客户端身份验证?

asp.net-mvc - 使用 MVC 和 ASP.Net Core 重写动态 url

android - 突然报错 "user is not allowed to see this application per the developer set configuration"

c# - 如何在 Azure AD 身份验证中将多个资源刷新 token 更改为 true?

c# - 路由中带有 id 的 ASP.NET Core 表单

apache - Blazor/Kestrel/Apache : How to configure properly?

c# - 剑道网格聚合柱

c# - 运行计时器函数时,函数 'Function1' 的监听器无法启动

C#(dotnet 核心)关联失败。 GKE 上的入口 (GLBC) 负载均衡器背后