ASP.NET 核心 SPA 中基于 JWT 的身份验证 - 前端验证

JWT-based authentication in ASP.NET Core SPA - front-end validation

我目前正在使用 ASP.NET Core 2.1 中的 KnockoutJS SPA 模板,我设法实现了与 Angular 中制作的完全相同的授权流程:

https://fullstackmark.com/post/13/jwt-authentication-with-aspnet-core-2-web-api-angular-5-net-core-identity-and-facebook-login

正如您在他们的用户前端服务中看到的那样,基本上唯一检查用户是否在客户端登录的是检查 "auth_token" 键是否存在于客户端的本地存储中:

https://github.com/mmacneil/AngularASPNETCore2WebApiAuth/blob/master/src/src/app/shared/services/user.service.ts

this.loggedIn = !!localStorage.getItem('auth_token');
// ?? not sure if this the best way to broadcast the status but seems to resolve issue on page refresh where auth status is lost in
// header component resulting in authed user nav links disappearing despite the fact user is still logged in

简单地说,任何人都可以打开浏览器本地存储并使用 "auth_token" 键插入一个随机字符串,他们将能够在 UI 中看到所有与管理相关的内容(甚至尽管它们会在 API 个请求上失败)。

有人可以为此建议更好的流程吗?或者是发送 "log in request" 到 API 的唯一选项,只要管理页面是 "opened"?

P.S。我对身份验证方案比较陌生,JWT 是否应该不用于客户端内容验证?

考虑到 JWT 的最佳实践,您的所有验证都应该在您的后端完成,因为您的网络应用程序中编码的任何验证都可以被您的任何客户端读取,从而导致巨大的安全漏洞:任何人都知道如何为您的应用程序创建有效的 JWT。

即使没有任何数据也能看到您的管理员相关 UI 是个大问题吗?考虑到所有可以 return 敏感数据的路由都受到 JWT 授权的保护,如果用户访问任何需要数据的页面或 UI 的部分,他们将触发检索它的请求,这可能 return 401(未授权)HTTP 状态,或类似的。在这些情况下,常见的前端做法是删除客户端用户数据,然后重定向到登录页面。

因此,典型的流程是:

  • 用户将伪造的访问令牌插入他们的存储
  • 用户打开一个管理员 page/ui,它以任何方式使用敏感数据(显示、用于任何内部逻辑等)
  • Web 应用程序向 API 请求数据
  • API returns 一个将被解释为授权错误的响应
  • Web 应用程序收到 API 响应,删除用户访问令牌并将他们重定向到其登录页面

在大多数情况下,整个流程的发生速度足以阻止您的用户进一步交互和浏览您的网络应用程序。

如果你提供更多关于你的场景的信息会更好,这样任何人都可以理解你的担忧是否需要考虑并真正解决。但是,在大多数情况下,上述行为是可以接受的。