我目前正在使用ASP.NET Core 2.1中的KnockoutJS SPA模板,并且设法实现了与Angular中制作的授权流程完全相同的授权流程:
正如您在其用户前端服务中所看到的那样,基本上唯一检查用户是否在客户端登录的方法是检查客户端本地存储中是否存在“ auth_token”键:
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请求而失败)
有人可以为此建议更好的流程吗?还是“打开”管理页面时向API发送“登录请求”的唯一选择?
P.S。对于身份验证方案,我还比较陌生,也许应该不要将JWT用于客户端内容验证吗?
答案 0 :(得分:2)
考虑JWT的最佳做法,所有验证都应在后端进行,因为您的任何客户端都可以读取Web应用中编码的任何验证,从而导致巨大的安全漏洞:任何人都知道如何创建适用于您的应用程序的有效JWT。
即使没有任何数据也可以查看与管理员相关的UI,这是一个大问题吗?考虑到所有可以返回敏感数据的路由均受到JWT授权的保护,如果用户访问用户界面中需要数据的任何页面或部分,他们将触发请求以检索数据,这很可能会返回401(未经授权) HTTP状态或类似状态。在这些情况下,常见的前端做法是擦除客户端用户数据,然后重定向到登录页面。
因此,典型的流程是:
在大多数情况下,整个流程将足够快地进行,以阻止您的用户进一步交互并浏览您的Web应用。
如果您提供有关您的情况的更多信息会更好,因此任何人都可以理解,如果您的担忧是需要考虑并真正解决的。但是,在大多数情况下,上述行为是可以接受的。