是否可以利用 Open ID Connect 流程进行身份验证,然后再使用另一个授权规则来源?

Is it possible to utilise Open ID Connect flows for authentication but then have another source of authorization rules?

我的情况是这样的。我有一个遗留 Angular 应用程序调用节点 API 服务器。此节点服务器当前公开了一个 /login 端点,我将 user/pwd 从我的 Angular SPA 传递到该端点。节点服务器查询本地 Active Directory 实例(不是 ADFS),如果用户进行身份验证,它会使用存储在应用程序数据库(不是 AD)上的角色和权限来构建包含该用户声明的 jwt。 Angular 应用程序(实际上有 2 个)然后可以根据用户的权限使用令牌内容来抑制菜单 options/views。在调用 API 时,还会根据传入的令牌评估使用该端点的权利。

我们现在正在考虑将我们的身份验证来源转移到 oAuth2.0 提供商,以便客户可以使用他们自己的 ADFS 或其他身份提供商。但是,他们将需要在我的应用程序本身中保留对授权规则的控制,因为管理员通常无权访问 Active Directory 以维护其中的用户权限。

我似乎找不到解决此用例的 OIDC pattern/workflow。我想知道我是否可以从我的客户端调用 /authorize 端点,然后将返回的代码传递到我现有的节点服务器以调用 /token 端点。如果该调用在 Node 中成功,那么我认为我可以继续构建我的自定义 JWT,因为我现在正在使用来自我的 oAuth2 token/userinfo 和应用程序数据库的混合信息。我很高兴我现有的机制可以处理令牌刷新和撤销。

我想知道我在客户端应用程序中的特定应用程序声明以便隐藏菜单选项,这让事情变得更难了。如果这只是在调用时保护 API 的情况,我猜我可以在每次调用受保护的 API 时通过 sub 查找权限。

我很害怕我找不到任何人做类似事情的帖子。我是否错过了 OIDC 的重点(我是新手!)。

提前致谢...

您只能从您的 OAuth 提供商处获得身份验证。您必须自己管理授权。您将无法在 SAML 响应或用户信息中依赖 OIDC,除非您可以连接到身份验证过程以注入您需要的值。 (AWS 有一个预令牌生成挂钩,您可以将自定义声明添加到您的 SAML 响应中。)

如果我正确理解了您当前的流程,您必须将从 /userinfo 获取的数据移动到应用程序的数据库,并为管理员提供管理这些权限的方法。

我不确定这个答案是否为您提供了足够的信息来确定如何完成您想要的。如果您能让我们知道您使用的框架和基础设施,我们可能会为您推荐一些可以提供帮助的特定工具。

问得好,因为几乎所有现实世界的授权都是基于特定领域的声明,而这往往没有得到很好的解释。以下说明描述了要达到的主要行为,与您的提供商无关。 scopes and claims 上的 Curity 文章提供了有关设计授权的更多背景信息。

机密令牌

UIs 可以从 ID 令牌中读取声明,但不应读取访问令牌。此外,返回给 UIs 的令牌不应包含敏感数据,例如姓名、电子邮件。令牌保密的方法有两种:

  • ID 令牌应该是只有主题声明的 JWT
  • 访问令牌应该是只有主题声明的 JWT,或者应该是 introspected
  • 的不透明令牌

在 UIs

中获取域特定声明

UI 如何获取所需的域特定数据?这里合乎逻辑的答案是将访问令牌发送到 API 并取回以下一种或两种类型的信息:

  • 令牌中的身份信息
  • API 查找的域特定数据

在 APIs

中获取域特定声明

API 如何从仅包含 UUID 主题声明的 JWT 中获取所需的域特定数据?这里有两个选项:

  • 授权服务器 (AS) 在颁发令牌时获取域特定数据,以将自定义声明包含在访问令牌中。然后 AS 将 JWT 和 returns 一个不透明的访问令牌存储到 UI.

  • API 在首次收到访问令牌时查找特定于域的声明,并形成由身份数据和特定于域的数据组成的声明主体。请参阅我的 Node.js API code 示例。

将身份数据映射到业务数据

在 Curity,我们有一个关于此主题的 recent article,它也可能对您的迁移有用。这将帮助您设计令牌和规划端到端流程,以便为您的 API 和 UI 提供正确的声明。

外部身份提供商

这些根本不影响架构。您的 UI 始终使用 OIDC 重定向到 AS,并且 AS 管理与 IDP 的连接。颁发给你的应用程序的令牌完全由 AS 决定,无论 IDP 是否使用 SAML 等