Jwt 在Blazor客户端Wasm中存储承载令牌?什么';策略是什么?

Jwt 在Blazor客户端Wasm中存储承载令牌?什么';策略是什么?,jwt,blazor,webassembly,Jwt,Blazor,Webassembly,使用ID4和其他方法通过PKCE安全地获取JWT承载,并使用刷新,从Blazor Wasm安全地调用API,有很多好的例子。。。非常有用。但是所有的样本都说要将JWT存储在本地存储中。这不危险吗?我想是的,但我希望是错的 任何人都可以使用浏览器开发工具从本地存储中复制JWt。当然,要使JWT短时间存在,但刷新令牌需要存储在某个地方,所以问题并没有得到解决。当然,API可以有受众和作用域。。。但是blazor wasm可以从任何来源调用API。当然,ID提供者证书不可能创建具有有效sig的新JWT

使用ID4和其他方法通过PKCE安全地获取JWT承载,并使用刷新,从Blazor Wasm安全地调用API,有很多好的例子。。。非常有用。但是所有的样本都说要将JWT存储在本地存储中。这不危险吗?我想是的,但我希望是错的

任何人都可以使用浏览器开发工具从本地存储中复制JWt。当然,要使JWT短时间存在,但刷新令牌需要存储在某个地方,所以问题并没有得到解决。当然,API可以有受众和作用域。。。但是blazor wasm可以从任何来源调用API。当然,ID提供者证书不可能创建具有有效sig的新JWT…但是复制的JWT仍然是危险的

React和Angular SPA也有同样的问题,而服务live Auth0通过定制JavaScript libs进行了大量工作,以缓解这个问题


那么,Blazor在API调用之间在客户机上存储JWT的策略是什么?我们能不能只注入一个内存单例来存储JWT作为“appstate”对象的一部分?这种方法安全吗?还有更好的主意吗?wasm“内存”对原生应用程序的抗黑客攻击能力是否相当?

好的,下面是我们得出的结论。欢迎评论

  • 使用VS脚手架解决方案很好。这节省了很多时间
  • 但是,由于JWT存储在会话存储中,因此搭建的解决方案非常容易受到重播攻击
因此,我们添加了自己的自定义头和TOTP(定时一次性密码)。共享秘密将在登录时获得,并仅存储在Wasm内存中。这仍然不是完美的,但我们会混淆它很多

与存储在Wasm内存中的短期JWT相比,我们从上面看到的唯一一大优势是,我们不必花费时间重新编码或重写搭建的JWT行为

第二个小优势是TOPT比JWT刷新周期的开销更小

但是…我们很想听到一些更聪明的人提出更好的想法!希望这同时能有所帮助

我们主要关心的不是XSS或中间人。这是一个重播攻击,类似这样的东西…假设我们是一个小东西的批发商,这些小东西非常有价值,很容易在黑市上出售。Legit customer-employee用户在工作时登录,并使用浏览器开发工具复制JWT。她还复制了一份订购某些产品的邮件。她给自己发电子邮件。(她不是一名主犯)。她回到家,点燃邮递员的火花,把船换成了地址。(我们的API体系结构实际上并没有这么弱,但就目前而言的确如此)。她点击send,我们的API下订单,向她的工作计费,但发送到她的家庭地址。(再说一遍,她不是一名主犯。)这是我们想要避免的主要情况


我们还担心虚假恶意软件“VPN”重播,但这是一个MiM,和JWT的本地存储无关。一个令人高兴的巧合是,托普也会让我们更加坚强地面对这种威胁。

顺便说一句,我读了一些关于Wasm记忆的资料。wasm高手黑客需要找到一个甚至稍微模糊的键值。因为我们是被MONO包装的,所以需要一个MONO wasm高手。所以我把钥匙的内存存储称为一个安全的选择。您的里程可能会有所不同。