上下文
我们在解决方案中使用Identity Server进行身份和访问控制。我们的作用域名称采用URL的形式,因此长度为40至60个字符。
前一段时间,我们收到了一个请求,要求增加请求中范围的最大长度。在InputLengthRestrictions类中,默认值设置为300,可以很容易地更改它。但是,经过一些讨论,事实证明,现在将最大值增加到500或1000可能就足够了,但是在将来,可能需要更大的限制才能请求10、20或更多范围
问题来了。要求具有如此众多范围的访问令牌是一种好习惯吗?优点和缺点是什么?
我的想法
从我的角度来看,拥有一个“超级”访问令牌的主要优点是一个主要优点,即它很方便,因为它允许您调用所有API。
另一方面,我看到一些缺点和/或代码异味:
您怎么看?您还看到超级代币的其他优点/缺点吗?我不确定,但是大型超级令牌可能会影响Identiy Server的性能。
答案 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仅显示日历。
我的配置:
它没有使用Mvc2请求所有作用域,因为它没有使用其他功能。请求所有范围都没有道理。而且,如果Mvc2是第三方应用程序,则不应这样做,因为即使这不是目的,他们也可以使用它。
此处的最佳做法是,客户端仅请求允许的范围(在IdentityServer中配置),并且可以由客户端实现。
到目前为止,用户尚未参与,因为范围和用户之间没有关系。但是,客户端需要用户(作为资源所有者)实际访问资源。
然后是用户授权,以确定用户是否可以在日历上创建事件。此“权限”不是范围。
范围Calendar.Event.Create
不允许 user 创建事件。它只允许 client 连接到资源。
将客户端和用户组合在一起时,只有一种情况可以使用户创建事件:具有创建权限的用户使用Mvc1中的管理页面。
即使用户具有创建权限,Mvc2也无法访问资源。
现在开始回答您的问题:
请求这么大的访问令牌是否是一种好习惯? 范围数?
访问令牌应仅包含所需的范围,如上所述。客户应仅请求必要的范围。
Calendar
,其中用户权限定义了允许用户执行的操作(CRUD权限)。我怀疑问题是范围用作权限。从范围中删除“ CRUD”,然后重新设计用户授权。不要在声明中设置权限。
在我的设计中,不需要超级令牌,也永远不会达到极限。作用域很少,访问令牌仅包含子声明,策略服务器会告诉我允许用户执行的操作。
我希望这对您有任何帮助。如果有不清楚的地方请告诉我。
答案 1 :(得分:1)
您可以为其实施服务帐户流程。使用它,您可以获得具有所有允许范围的客户的令牌。
通过这种方式,您的令牌没有包括所有范围,但允许客户使用范围。
我现在没有示例代码,但是您可以检查如何实现服务帐户