2017-08-02 59 views
3

我正在尝试将使用JWT登录的网站放在一起。我的问题是,我不明白网站应该如何使用智威汤逊。如何在C#AspNetCore网站中使用JWT JSON Web令牌?

的想法是我的整体架构分成:

  • 的IdentityServer认证和签发JWTs。
  • 具有受基于JWT角色保护的端点的ApplicationServer API。
  • 从IdentityServer请求JWT并将其用于访问ApplicationServer上的数据的前端应用程序和网站。

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

我已经构建了IdentityServer。它可以接受用户名/密码,验证并发出访问令牌和刷新令牌。超。 访问令牌是短暂且不安全的,并且打算定期刷新。目的是将其存储在客户端,无论是应用程序还是网页。 刷新令牌寿命更长,并且旨在安全地存储。在一个网站上,这将存储在服务器端,并在一个应用程序中存储在'会话'期间的安全存储。

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

  • 当用户最初访问某个动作时,他们没有令牌。
  • 前端Web服务器应将其重定向到登录页面,并请求凭据(用户名和密码)。
  • 网络服务器将凭证转发给IdentityServer,如果证书有效,则IdentityServer应该将访问和刷新令牌返回给网络服务器。
  • 网络服务器会缓存刷新令牌并将访问令牌发送回网页。
  • 然后,客户端网页会缓存访问令牌并将其与每个其他页面请求一起发送。
  • 网络服务器会解码访问令牌,如有必要可能会刷新它,然后用更新后的访问令牌发回页面。
  • 对话(会话)在请求进入时带有陈旧访问令牌并且刷新令牌过期并且用户被重定向到登录页面所需的时间已到。

对于如何将访问令牌返回到网页,我有点遗憾。

此外,我不明白如何网页可以自动附加一个令牌与每个请求,如果它有一个,或者如何网页可以响应401挑战,如果没有。

Cookie是将数据附加到HTTP会话并在导航过程中将其保存在客户端的唯一方法?

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

另外,是否可以编写网页,使他们总是使用访问令牌填充授权标头(如果存在)?

我意识到我可能以为自己陷入了一个结,任何帮助将不胜感激。

+0

我相信你的令牌应该存储在web请求头中。随着它的每一个请求,它允许挑战。在每次通话中,验证访问权限。而不是cookie,尽管它是一个选项。 – Greg

+0

是的,我不明白的是如何从客户端获取每个请求以包含授权标头。 –

+0

为什么不能在每个请求中手动添加包含授权,持票人和提供的标记值的标头? 'request.Headers.Add(“authorization”,$“bearer = {token}”);'。沿着这些线路的东西? – Greg

回答

0

你应该有一个对Auth0的文档资源所有者密码格兰特https://auth0.com/docs/api-auth/grant/password

我会继续刷新令牌和访问客户端上阅读了令牌在一起。

我的方法是。

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

希望它有帮助

+0

我现在已经实现了这一点,并学到了更多。我将刷新令牌保存在服务器上的RAM查找缓存中。我将访问令牌保存在客户端的Cookie中。所有请求都会在Cookie中检查访问令牌,如果过期,刷新令牌将用于获取新的访问令牌(或者如果刷新令牌失效,则再次登录)。然后,客户端可以访问其他操作或页面并拥有cookie,但不会公开刷新令牌。访问令牌绑定到IP地址和用户代理。 Cookie是HTTPOnly,HTTPS是所有的东西。 –