通过 OpenID Connect over ADFS 作为声明的用户组

Max*_*ahl 3 adfs openid-connect

我需要帮助弄清楚如何通过 OpenID Connect over ADFS (Windows Server 2016) 获取用户的分配组。我目前能够对用户进行身份验证并获取包括 access_token 在内的用户信息。当我检查 JWT 令牌时,我可以看到其中的所有默认声明。我想要的是将所有用户分配的系统组作为字符串数组添加到声明中,但我不知道如何实现这一点。ADFS 和 Windows Server 是一头野兽,Google 的所有搜索结果都没有将我引向正确的方向。我发现的所有文章都没什么用,因为它们的步骤要么不完整,要么如果您没有受过整个 ADFS-shebang 的教育,就很难理解。

我已经被这个问题困住了几天,需要一些帮助,希望有人知道这方面的知识。

到目前为止我所做的:

  1. 我向 ADFS 添加了一个应用程序组,其中包含一个“服务器应用程序”和一个“Web API”。
  2. 我添加了一个名为 Admin 的用户组并将其分配给名为 max 的用户。
  3. 我可以通过 ADFS 上的 OpenID Connect 登录并从 userinfo-endpoint 获取用户信息。
  4. 我已经能够解码 access_token 以访问声明。

我目前正在使用范围“openid”、“email”和“profile”进行身份验证。

Max*_*ahl 10

我们刚刚让一切正常,所以我只是想如果其他人想要做我们所做的,我会分享我们所做的。

先决条件

为了能够执行以下步骤,您需要启用 Windows Server 2016 或更高版本并启用“Active Directory 联合身份验证服务 (ADFS)”功能。

将 OpenID Connect 配置添加到 ADFS

  1. 打开位于服务器管理器右上角“工具”菜单下的“AD FS 管理”工具。
  2. 在左侧边栏中选择“应用程序组”文件夹项。
  3. 单击右侧边栏中的“添加应用程序组...”。
  4. 为应用程序组命名,例如“OpenID Connect”
  5. 选择“访问 Web API 的服务器应用程序”列表项,然后单击下一步。
  6. 客户端标识符复制并粘贴到文本文件以供以后使用。
  7. 输入您的身份验证“重定向 URI”,然后单击下一步。
  8. 勾选“生成共享机密”框。将Secret复制并粘贴到文本中以用于您的应用程序。点击下一步。
  9. 粘贴并添加客户端标识符(来自第 6 步)作为“标识符”。点击下一步。
  10. 选择您要使用的访问控制策略,然后单击下一步。
  11. 确保勾选“openid”旁边的框。
  12. 单击底部的“New scope...”按钮并为其命名为“allatclaims”,单击“确定”。需要此范围来提供附加信息作为声明,例如用户组。
  13. 完成向导。

配置 OpenID Connect 以提供用户组作为声明

  1. 打开位于服务器管理器右上角“工具”菜单下的“AD FS 管理”工具。
  2. 在左侧边栏中选择“应用程序组”文件夹项。
  3. 双击之前添加的组,然后双击“Web API”应用程序。
  4. 选择名为“颁发转换规则”的选项卡。
  5. 单击底部的“添加规则...”按钮。
  6. 选择“将 LDAP 属性作为声明发送”并单击下一步。
  7. 为规则命名,例如“角色”。
  8. 选择“Active Directory”作为“属性存储”。
  9. 在下表中,在第一列中选​​择“Token-Groups Unqualified Names”,然后在第二列中键入“roles”。

配置 OpenID Connect 以提供特定用户组作为声明

  1. 打开位于服务器管理器右上角“工具”菜单下的“AD FS 管理”工具。
  2. 在左侧边栏中选择“应用程序组”文件夹项。
  3. 双击之前添加的组,然后双击“Web API”应用程序。
  4. 选择名为“颁发转换规则”的选项卡。
  5. 删除您可能已经添加的任何规则。
  6. 单击底部的“添加规则...”按钮。
  7. 选择“使用自定义规则发送声明”并单击下一步。
  8. 将规则命名为“StoreRoles”并将以下内容粘贴到“自定义规则”字段中:
  9. 单击完成并添加另一个规则。
  10. 再次选择“使用自定义规则发送声明”并单击下一步。
  11. 将此规则命名为“IssueRoles”并将以下内容粘贴到“自定义规则”字段中:
    • c:[Type == "roles", Value =~ "^Prefix.+"] => issue(claim = c);
  12. 包含 // "^Prefix.+" // 的部分是一个正则表达式,用于过滤作为声明一部分发送的窗口组。在这种情况下,我们只接受以“前缀”开头的窗口组。调整它以满足您的需求。
  13. 单击完成。