理解Claims

20

我试图学习OpenId Connect、OAuth2.0、安全令牌服务和声明。想象一下,有一个功能丰富的大型网站,包含许多区域和不同的功能,例如:客户、订单、供应商、交付、退货等。我的问题是这样的 - 我是否应该在令牌服务器上创建声明(claims),例如CanCreateCustomer、CanReadCustomer、CanUpdateCustomer、CanDeleteCustomer等,即为每个主要区域/业务对象实际上创建CRUD声明?这将导致许多十个,更可能是数百个声明。或者是我的理解有所欠缺?

4个回答

21

修正术语,您指的是“作用域”,而不是“声明”。作用域是用于指定请求的访问权限的标识符。声明是包含有关用户信息的名称/值对。

因此,好的作用域示例是“read_only”。而声明的示例将是“email”:“john.smith@example.com”。

您可以在ID令牌(或JWT)中发送声明,也可以通过userinfo端点(如果使用“openid”作用域)使其可用。

您可以按服务拆分作用域,并根据需要将它们分解得非常细。或者将它们作为高级别(读取/写入/管理)。我建议设置足够的作用域以积极实现最小特权安全原则(基本上就是:给予人们完成工作所需的权限)。如果您有很多作用域,可以使用命名空间。


那么,作用域是关于授权的,而声明则是关于身份的吗?如果OAuth客户端请求“读取”作用域,是否需要在令牌中返回一定的声明集合? - jmrah
是的,作用域和声明有关于授权(或个人权限),而身份则与身份识别有关。我认为每个作用域返回的声明在OAuth规范中并没有真正定义。Open Id Connect(或OIDC)基于OAuth规范,并定义了常见的作用域,如“profile”和“openid”参考:https://auth0.com/docs/scopes/current/oidc-scopes - Jordan Stewart

4

您的理解是正确的,但在OAuth2.0范围(claims)方面,您有更多的灵活性。

这些范围可以按任何方式进行配置,例如,在您的情况下,您可以创建组范围,而不是为每个主要区域的每个CRUD操作创建单独的范围,如:

customer.read_write
order.read_write 

等等,你甚至可以通过创建功能级别的作用域,如

webportal.full_access
adminportal.full_access

在您的应用程序中,经过身份验证后,可以进行授权,如下所示:

ValidScopesIn({Scopes.WEBPORTAL_FULL_ACCESS, Scopes.CUSTOMER_READ_WRITE})
public void createCustomer(Customer customer) {
// your creation logic 
}

1
我认为您的理解大体上是正确的。然而,如果我正确理解您所描述的,似乎更像是授权(OAuth)问题而非身份验证(OIDC)问题,因此您可以查看其他OAuth资源提供者如何定义其范围(不是声明),例如GitHubSlack

1
我建议将“scopes”配置为URI,以避免发生冲突。
例如,作为示例
-jim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接