我的情况是这样的。我有一个遗留的Angular应用程序,它调用Nodeneneneba API服务器。该Node服务器当前公开了一个/login端点,我将Angular SPA中的用户/pwd传递给该端点。节点服务器查询本地Active Directory实例(而非ADFS),如果用户进行了身份验证,它将使用存储在应用程序数据库(而非AD)上的角色和权限来构建包含该用户声明的jwt。Angular应用程序(实际上有2个)可以使用令牌内容来抑制基于用户权限的菜单选项/视图。在调用API时,还将根据传入的令牌评估使用该端点的权限。
我们现在正在考虑将我们的身份验证源转移到oAuth2.0提供商,以便客户可以使用自己的ADFS或其他身份提供商。但是,他们需要在我的应用程序本身中保留对授权规则的控制,因为管理员通常无权访问Active Directory来维护其中的用户权限。
我似乎找不到一个OIDC模式/工作流来解决这个用例。我想知道是否可以从客户端调用/authorize端点,但随后将返回的代码传递到现有的Node服务器中以调用/token端点。如果在Node中调用成功,那么我想我可以继续构建我的自定义JWT,就像我现在使用oAuth2令牌/userinfo和应用程序数据库中的混合信息一样。我很高兴我现有的机制能够处理令牌刷新和撤销。
我想我想知道我的客户端应用程序中的特定应用程序声明,这样我就可以隐藏菜单选项,这让事情变得更难了。如果这只是一个在调用时保护API的情况,我猜我可以在每次调用受保护的API时通过sub查找权限。
我吓坏了,因为我找不到任何类似的帖子。我是不是错过了OIDC的要点(我是新来的!)。
提前感谢。。。
这个问题很好,因为几乎所有现实世界中的授权都是基于特定于域的声明,而这一点往往没有得到很好的解释。以下注意事项描述了要针对的主要行为,而不考虑您的提供商。Curity关于范围和索赔的文章提供了设计您的授权的进一步背景。
机密代币
UI可以从ID令牌中读取声明,但不应该读取访问令牌。此外,返回到UI的令牌不应包含姓名、电子邮件等敏感数据。有两种方法可以对代币保密:
- ID令牌应该是只有主题声明的JWT
- 访问令牌应该是只有主题声明的JWT,或者应该是内省的不透明令牌
在UI中获取领域特定索赔
用户界面如何获得所需的特定于域的数据?这里的逻辑答案是将访问令牌发送到API,并获取以下类型的信息中的一种或两种:
- 令牌中的身份信息
- API查找的特定于域的数据
在API中获取领域特定声明
API如何从只包含UUID主题声明的JWT中获得所需的域特定数据?这里有两个选项:
-
授权服务器(AS)在令牌发布时访问特定于域的数据,以在访问令牌中包含自定义声明。AS然后存储JWT,并向UI返回一个不透明的访问令牌。
-
API在首次接收到访问令牌时查找特定于域的声明,并形成由身份数据和特定于域数据组成的声明主体。有关示例,请参阅我的Node.js API代码。
将身份数据映射到业务数据
在Curity,我们最近有一篇关于这个主题的文章,可能对您的迁移也很有用。这将帮助您设计令牌并规划端到端流,以便向您的API和UI提供正确的声明。
外部身份提供者
这些根本不会影响体系结构。您的UI总是使用OIDC重定向到AS,AS管理与IDP的连接。颁发给您的应用程序的令牌完全由AS决定,无论IDP是否使用SAML等
您只能从OAuth提供程序获得身份验证。您必须自己管理授权。您将无法在SAML响应或userinfo中依赖OIDC,除非您能够连接到身份验证过程中注入所需的值。(AWS有一个预代币生成挂钩,您可以在SAML响应中添加自定义声明。)
如果我正确理解您当前的流程,您必须将从/userinfo获得的数据移动到应用程序的数据库中,并为管理员提供管理这些权限的方法。
我不确定这个答案是否能给你足够的信息来弄清楚如何实现你想要的。如果您能让我们知道您使用的框架和基础设施,我们可能会为您提供一些可以帮助的特定工具。