Security Identity server API策略和角色

Security Identity server API策略和角色,security,asp.net-core,oauth,permissions,identityserver4,Security,Asp.net Core,Oauth,Permissions,Identityserver4,我们目前有一个使用Identityserver4 2.0构建的身份服务器。我们正在为API添加一些政策指南。我已经读了很多教程,主要是这本 我认为我们在如何做到这一点上有一些误解。据我所知,我们的API将检查当前用户的授权,并围绕此构建策略。基本上,我们正在检查用户在报头中发送的令牌是否正确 我的问题是,如果用户在创建令牌后更改了权限。假设访问令牌在1小时内有效,并且刷新令牌不会过期。这是否意味着拥有有效令牌的用户在一个小时内仍然可以访问东西 我们如何确保当前经过身份验证的用户仍然拥有执行声明中

我们目前有一个使用Identityserver4 2.0构建的身份服务器。我们正在为API添加一些政策指南。我已经读了很多教程,主要是这本

我认为我们在如何做到这一点上有一些误解。据我所知,我们的API将检查当前用户的授权,并围绕此构建策略。基本上,我们正在检查用户在报头中发送的令牌是否正确

我的问题是,如果用户在创建令牌后更改了权限。假设访问令牌在1小时内有效,并且刷新令牌不会过期。这是否意味着拥有有效令牌的用户在一个小时内仍然可以访问东西


我们如何确保当前经过身份验证的用户仍然拥有执行声明中所述操作的权限?

这是(jwt)令牌的要点,您不必在每次请求时访问数据库


身份令牌(长寿命令牌)和访问令牌(短命令牌)虽然我的回答可能没有Tseng的评论和上一篇评论那么深刻,但我对此进行了一些尝试,并采取了一种稍微不同的方法

我被要求将角色转储到已发布的令牌中,是的,您100%正确地认为,除非令牌被更新(我的案例是1小时),否则如果api服务器未被任何调用击中,他们可以访问该令牌1小时或更长时间

我的解决方法有两点:

  • 强制点击API服务器以验证用户(每60秒一次)
  • 一旦用户在identityserver4上的角色发生更改,就为其执行令牌擦除
这可能不是pretties解决方案,但它意味着超级管理员在更改您的角色时,会从db存储中删除用户令牌(如果有)。 前端会在60秒后(如果用户进行调用,则在60秒前)命中api服务器,迫使用户再次重定向到登录页面以获取新令牌

这意味着在最坏的情况下,用户可以在其令牌被擦除后60秒内访问


这不是最干净的解决方案,但却成功地完成了实验。

我的部分问题是be的权力。他们希望我将所有东西都放在令牌中。我们正在拆分一个非常大的api,他们担心每次检查数据库的用户访问权限都会使事情过载,这就是为什么他们希望在令牌中使用它的原因。我反对这一点,因为我不能接受被删除访问权限的人仍有一小时的访问权限。在这里,您可以使用本地(或分布式)内存缓存来存储权限。您还需要一个基于消息的系统,以便在权限更改时使此内存缓存无效(因为有人编辑了它们)但是,至少在使用jwt令牌的情况下,令牌中的所有内容都是不好的。令牌中唯一应该包含的内容是角色(如果更改频率较低,不需要立即失效)和作用域,它们告诉用户是否可以访问api(即
作用域:[“order”,“profile”]
,用户可以使用它访问订单或配置文件webapi。如果他没有“订单”范围,当尝试访问订单API时,他会被完全拒绝。但是如果您想检查用户是否有权订购特定项目或取消订单,则应根据服务基础和权限系统进行检查(+如果性能成为问题,则进行缓存)也具有可读性,尤其是“声明应为用户身份建模,而不是权限”你必须验证我已经知道的一切。现在我只需要学会更好地解释它。你不会相信我们在声明中所说的,目前它被用作数据存储IMO。我担心我们很快就会达到JWT的大小限制,这就是为什么将许可权放入令牌是一个坏主意(除其他外)@leastprivilege看到这就是我们一直在等待的我还没看到你们上传了开源项目。
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
{
}