如何使用 OAuth2 / OpenID Connect 进行基于角色的授权?

信息安全 验证 oauth 授权 开放式连接
2021-08-14 04:46:32

我正在尝试使用 OAuth2 进行身份验证/授权,但经过大量阅读后,我很困惑......我试图了解 OAuth 和 OpenIDConnect 如何相互关联,以及我如何准确地将它们用于授权。

据我目前了解

  • OpenID Connect最适合身份验证,OAuth 最适合授权

  • OAuth2授权是通过范围完成的

  • 范围是用户授予客户端的权限,在资源服务器上验证

  • OpenID Connect id_token 主要用于客户端应用程序,提供用户信息,而不是作为资源服务器验证用户的一种方式

这是我的用例

  • 我需要为我们制作的一组完全无状态的 Web 服务提供 SSO
  • OAuth 仅限于 resource_owner 授权
  • 身份服务器在我们这边提供,并连接到 LDAP 服务器
  • 只有受信任的应用程序才能注册为服务提供商

而我正在尝试做的事情让我感到困惑:

  • 只有授权用户才能访问给定的 Web 服务 API

因此,我需要一些方法来检查外部实体在资源服务器上授予用户的权限。我认为哪个排除了使用 OAuth 进行授权的可能性?

我不确定如何使用 OAuth/OpenID 连接来实现这一点,甚至不确定它是否适合我的用例。

  1. 是否可以使基于角色的访问完全适用于 OAuth2 范围?
  2. id_token传递给资源服务器是否可以,并带有包含用户角色的声明(并完全丢弃 access_token)?因此 id_token 将用于身份验证和授权。鉴于 id_token 已签名并包含散列,这会很好,对吧?
  3. 我是否应该只通过 OpenIDConnect 进行身份验证,通过检查 id_token 的存在,完全废弃 access_token,并开发我自己的基于角色的授权系统?

为文字墙道歉,我只是不确定我是否误解了 OAuth/OpenID Connect 的范围。我是否做出了错误的假设?

1个回答

角色概念可以与 OpenID Connect (Oauth2) 中的访问令牌一起使用。

考虑一个范围是对应该包含在访问令牌中的用户声明的请求。请求访问的 API 知道它需要(比如说)“员工”角色,scope=openid roles在请求中包含“”查询参数。

身份验证服务器 (AS) 有权访问有关用户的角色信息(例如,在 LDAP 目录中)。然后它可以查找用户的角色,并将它们包含在访问令牌的“角色”声明中。

您还可以通过请求角色本身 ( scope=openid employee) 来缩小范围,在这种情况下,如果用户是该组的成员,AS 可以包含它。这有点不太可扩展,因为它需要有关所需角色的详细知识,但会减少令牌中 PII 的数量,并减小其大小。此外,如果用户不是指定组的成员(即范围不能包含在令牌中),则 AS 必须按照 OAuth2 通知 API。

角色使用相当普遍,可以在以下位置找到一些示例:

至于问题2)和3):不要这样做:)