在使用JWT

时间:2018-11-04 03:57:43

标签: authentication .net-core jwt asp.net-core-2.1

我一直在使用JWT对我的ASP.NET Core 2.1 API项目中的HTTP端点的用户进行身份验证。我已经配置了身份验证服务,并且一切都进行顺利。

在生成令牌时,通常将到期时间设置为24小时。我的问题是,如果在颁发令牌后用户被管理员阻止,该怎么办?现在,令牌已发出,身份验证中间件将仅对请求进行身份验证。

因此,我想我需要拦截每个请求以进行后端调用,以了解用户是否被阻止。我可以在每个端点级别上执行此操作,但是我认为它效率不高。

此问题的最佳解决方案是什么?有没有比我想象的更好的方法来解决它?

1 个答案:

答案 0 :(得分:1)

当您选择使用JWT时,请接受JWT的性质。这意味着拥有“实时”信息的唯一方法是在信息过时时使令牌过期。将访问令牌的生存期设置为一个小窗口,例如少于五分钟。这样,您就知道信息始终是有效的,而不必更改有关当前处理的任何信息。这是“几乎实时的”,因为更改在五分钟内生效。

寿命短的优点是,这也可以提高网站的安全性。令牌遭到破坏后,只能使用很短的时间。

您必须添加对刷新令牌的支持,因为您不希望用户每五分钟登录一次。因此,当访问令牌过期时,请使用刷新令牌来请求新的访问令牌。这仅适用于可以保密的应用。因为刷新令牌非常强大,所以您不希望它落入错误的手中。您可以使用一次性刷新令牌来限制风险,并添加策略来检测不同的行为。有关更多详细信息,请阅读我的答案here

您还可以选择从JWT中删除授权声明,并将授权移至中间件,您可以在其中实时检查用户的权限。在那种情况下,JWT仅包括对用户进行标识和建模的用户声明。不太可能经常更改的声明。因此,访问令牌不必太短,但是出于安全原因,我认为这还是可取的。

最低要求是subuserid声明。这足以识别用户并授予用户访问该网站的权限。

我认为Policy Server是可能的中间件授权实现的一个很好的例子。此处,中间件从json文件读取权限,并将权限作为对身份的声明添加。政策在哪里决定允许用户做什么。还要实现resource-based authorization

一种替代方法是使用reference tokens,由IdentityServer实施。 IdentityServer将令牌的内容存储在数据存储区中,并且只会将此令牌的唯一标识符返回给客户端。然后,收到此引用的API必须打开与IdentityServer的反向通道通信,以验证令牌。

这样做的好处是您可以随时使用撤消端点撤消引用令牌。