我正在开发一个api服务器,用于恢复来自移动应用的请求。我正在使用JWT
ASP.Net MVC Web API 2
。在此管理员中,可以向移动应用用户访问各个部门。我在登录时在Claims
设置了这些DeptIds。在应用程序的每个授权请求中,在自定义操作筛选器属性中,我读取声明以将请求URL中的deptId与声明匹配。这种情况都可以。
现在我的问题是,当管理员撤消来自应用用户的任何特定部门的访问时,我应该如何使该用户的access_token
到期,以便在登录请求调用时,我可以设置新的Claims
。否则,当管理员从服务器删除访问权限但是deptId仍然存在于用户的Claims
中,因此用户仍然可以访问该部门。
一种方法是在每个请求上,检入数据库以进行访问,但是增加服务器的开销也会增加响应时间。所以我不想这样走。
我没有在网上找到任何关于如何在JWT
中过期令牌的内容。任何人都可以帮忙吗?
答案 0 :(得分:5)
JWT令牌碰巧是一种允许它自包含的令牌,即可以在不咨询外部实体的情况下对其进行验证。
这也意味着没有外部实体会告诉您令牌已被撤销或过期。到期只能由JWT本身的某些财产发生; exp
声明为此目的而标准化:它会告诉收件人其中的信息必须不再被认为有效的时间
答案 1 :(得分:2)
Authentication和Authorization是不同的东西。
使用JWT进行身份验证,但不进行授权。我的意思是,使用JWT,您可以知道用户是谁,但不会将有关用户可以做什么的信息放入JWT。基于您从JWT获得的用户身份,检查服务器端用户的权限。您还可以向JWT提供一些额外限制访问权限的信息(例如,黑名单;例如,社交网站为游戏创建访问令牌以访问我的身份和朋友列表但不是我的帖子)但是不要提供信息直接提供对某些功能的访问(即白名单)。通过这种方式,您可以轻松删除对服务器端某些功能的访问,尽管用户已经使用JWT登录。
答案 2 :(得分:1)
我了解您对撤消或使令牌无效而非过期感兴趣。
不幸的是,它无法实现它 没有在某处保留令牌的轨迹:
发出一个令牌并将其添加到白名单中以跟踪它。
验证令牌时,请检查白名单,如果请求未列入白名单,请拒绝该请求。
要撤消或使令牌无效,请将其从白名单中删除。
此安全架构需要进行一些权衡。 处理它。
关于您的表现问题:请记住premature optimization is the root of all evil。在您遇到性能问题并且已证明表明性能问题来自您存储令牌的方式时,您不应该进行优化。
例如,您可以开始将令牌存储在数据库中,然后考虑内存中的缓存。但是在修复你目前没有的问题时要小心。
jti
声明应该用于在令牌上存储令牌标识符。验证令牌时,请通过检查服务器端的令牌标识符jti
声明的值来确保其有效。
对于令牌标识符,您可以使用UUID。