我们目前有一个使用Identityserver4 2.0构建的身份服务器。我们正在为API添加一些政策指南。我一直在阅读一些教程,主要是这一个Policy-Based Authorization in ASP.NET Core
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAuthorization(options =>
{
options.AddPolicy("RequireElevatedRights", policy => policy.RequireRole("SuperAdministrator", "ChannelAdministrator"));
});
}
[Authorize(Policy = "RequireElevatedRights")]
public class ChannelAdministrationController: Controller
{
}
我认为我们对如何做到这一点有一些想法。据我了解,我们的API将检查当前用户授权并围绕该授权构建策略。基本上我们正在检查用户在标题中发送的令牌是否正确?
我的问题是,如果用户在创建令牌后更改了权限。鉴于访问令牌有效期为1小时,刷新令牌不会过期。这是否意味着拥有有效令牌的用户仍然可以访问一小时的内容?
我们如何确保当前经过身份验证的用户实际上仍有权执行声明中的操作?
这是(jwt)令牌的要点,您不必在每次请求时都访问数据库。
身份令牌(长期令牌)和访问令牌(短期,<= 60分钟)不应包含授权相关数据。
身份令牌应仅包含很少更改并与用户身份相关联的声明(用户名,第一个+姓氏,生日,电子邮件,email_verified等)。
如果您希望频繁更改,请不要将“管理员”等角色置于其中。
授权(允许用户A创建它,或者读取/查看资源)应该在单独的(每个服务)数据库中完成,然后从那里获取它(如果需要,还可以缓存)。
您可以选择,如果您确实已在令牌中放置了此类“权限”,或者具有需要立即生效的情况(受损帐户或解雇工作人员),则可以撤销令牌。
但请记住,吊销端点仅适用于刷新和引用(也称为不透明)令牌。
你无法取消开箱即用的JWT。当然,当生成它时,可以在令牌中将唯一(和随机)ID放入内存缓存(redis,本地缓存)中,并使用令牌的到期时间。
在每个请求中,您检查该ID是否仍在缓存中。如果其位置和令牌有效,则允许访问。否则否认它。
当你做一些敏感的更改时,将消息发送到你的消息总线(rabbitmq,azure queues,redis),触发一个处理程序,从缓存中删除该id,并在下一个请求中找不到缓存中的值,并且拒绝访问
虽然我的回答可能没有Tseng的评论和前一篇文章那么深刻,但我对此进行了一些实验,并采用了略微不同的方法。
我被要求将角色转储到已颁发的令牌中,是的,你是100%正确的,除非令牌更新(我的情况是1小时),如果api服务器没有被点击,他们可以访问1小时或更长时间任何电话。
我的解决方法有两点:
它可能不是pretties解决方案,但它意味着超级管理员改变你的角色的那一刻,如果有的话,它会从db存储区擦除用户令牌。前端将在60秒后(或者在他们拨打电话之前)点击api服务器,迫使用户再次被重定向到登录页面以获得新令牌。
这意味着在最坏的情况下,用户可以在擦除令牌后60秒内访问。
不是最干净的解决方案,而是为实验做了诀窍。