具有大量作用域的“超级”访问令牌的优缺点是什么?

时间:2019-07-09 09:48:36

标签: oauth-2.0 identityserver4

上下文

我们在解决方案中使用Identity Server进行身份和访问控制。我们的作用域名称采用URL的形式,因此长度为40至60个字符。

前一段时间,我们收到了一个请求,要求增加请求中范围的最大长度。在InputLengthRestrictions类中,默认值设置为300,可以很容易地更改它。但是,经过一些讨论,事实证明,现在将最大值增加到500或1000可能就足够了,但是在将来,可能需要更大的限制才能请求10、20或更多范围

问题来了。要求具有如此众多范围的访问令牌是一种好习惯吗?优点和缺点是什么?

我的想法

从我的角度来看,拥有一个“超级”访问令牌的主要优点是一个主要优点,即它很方便,因为它允许您调用所有API。

另一方面,我看到一些缺点和/或代码异味:

  1. 必须请求大量范围的事实可能意味着 范围太细了。
  2. 必须请求大量范围的事实也可能暗示将范围更多地用作权限。对于令牌寿命很长的情况尤其如此,因为它们不容易被吊销。
  3. 请求大量范围可能意味着您请求 超出您的实际需求。但是,建议“选择尽可能严格的范围”。
  4. 如果具有超级访问令牌,则该令牌被拦截会带来更高的安全风险。
  5. 在隐式流中,令牌是在URL中传递的,因此大型超级令牌可以超过URL的最大长度。
  6. 超级令牌可能太大,无法存储在Cookie中(这是一个 如果令牌应存储在Cookie中,则为不同的主题)。
  7. 超级令牌可能很大,因此会影响网络性能。

您怎么看?您还看到超级代币的其他优点/缺点吗?我不确定,但是大型超级令牌可能会影响Identiy Server的性能。

2 个答案:

答案 0 :(得分:2)

我没有优点或缺点,但是也许这个答案可以为您提供帮助。

查看IdentityServer,您将看到三个部分,resource, the client and the user。 IdentityServer有两个主要职责,授权客户端验证用户。实际上,用户授权不是IdentityServer的职责。这就是为什么他们创建了PolicyServer

请考虑以下资源:

resource = CalendarApi
    scope = Calendar.Read
    scope = Calendar.Write
    scope = Calendar.Event.Create

资源只是一个逻辑名称。它可以由一个或单独的api组成(如在项目中),其中api可以实现单个或多个作用域。在api中,范围是某些功能的实现。

只有客户端可以请求范围,因为客户端知道如何使用该功能。

假设我有两个客户端:Mvc1和Mvc2。 Mvc1具有日历视图和管理页面,而Mvc2仅显示日历。

我的配置:

  • Mvc1:范围= Calendar.Read Calendar.Write Calendar.Event.Create
  • Mvc2:作用域= Calendar.Read

它没有使用Mvc2请求所有作用域,因为它没有使用其他功能。请求所有范围都没有道理。而且,如果Mvc2是第三方应用程序,则不应这样做,因为即使这不是目的,他们也可以使用它。

此处的最佳做法是,客户端仅请求允许的范围(在IdentityServer中配置),并且可以由客户端实现。

到目前为止,用户尚未参与,因为范围和用户之间没有关系。但是,客户端需要用户(作为资源所有者)实际访问资源。

然后是用户授权,以确定用户是否可以在日历上创建事件。此“权限”不是范围。

范围Calendar.Event.Create不允许 user 创建事件。它只允许 client 连接到资源。

将客户端和用户组合在一起时,只有一种情况可以使用户创建事件:具有创建权限的用户使用Mvc1中的管理页面。

即使用户具有创建权限,Mvc2也无法访问资源。

现在开始回答您的问题:

  

请求这么大的访问令牌是否是一种好习惯?   范围数?

访问令牌应仅包含所需的范围,如上所述。客户应仅请求必要的范围。

  1. 同意。范围的数量不应太详细。不要将范围视为权限,例如创建,编辑,阅读。尽管以我为例,但更好的范围是Calendar,其中用户权限定义了允许用户执行的操作(CRUD权限)。
  2. 同意,应进行调查。
  3. 如上所述,我会说是。
  4. 仍然是必须被授权的用户。但是,您应该限制客户端使用并非针对该客户端的功能的可能性。
  5. / 6. / 7.击中限制充分表明该体系结构可能需要重新设计。通常,您不应暴露超出必要的范围,并且应避免达到极限。

我怀疑问题是范围用作权限。从范围中删除“ CRUD”,然后重新设计用户授权。不要在声明中设置权限。

在我的设计中,不需要超级令牌,也永远不会达到极限。作用域很少,访问令牌仅包含子声明,策略服务器会告诉我允许用户执行的操作。

我希望这对您有任何帮助。如果有不清楚的地方请告诉我。

答案 1 :(得分:1)

您可以为其实施服务帐户流程。使用它,您可以获得具有所有允许范围的客户的令牌。

通过这种方式,您的令牌没有包括所有范围,但允许客户使用范围。

我现在没有示例代码,但是您可以检查如何实现服务帐户