背景
因此,过去几周我一直在绞尽脑汁尝试在各种应用程序中基于 ADFS 实现 OIDC 身份验证,特别是 Proxmox VE 和 Gitea。我这样做的原因主要是受 Proxmox 的驱动,我想用 YubiKey + PIN 替换我们基础设施管理员的常规用户名/密码身份验证。Proxmox 本身不支持此变体,因此我认为使用 ADFS 作为 OpenID 提供程序将是一个解决方案,因为它支持智能卡,因此也支持 YubiKeys。
到目前为止我尝试过的
将每个应用程序添加为“访问 Web API 的服务器应用程序”以及简单的“服务器应用程序”。虽然使用后者登录有效,但返回的用户名声明是乱码,我也无法控制谁被允许访问该应用程序。使用“服务器应用程序 + Web API”,基本身份验证有效,但以下用户信息请求失败:
MSIS9921: Received invalid UserInfo request. Audience 'microsoft:identityserver:<my-token>' in the access token is not same as the identifier of the UserInfo relying party trust 'urn:microsoft:userinfo'
将“访问控制策略”设置为“允许所有人”没有什么区别。
Gitea 的示例配置基于https://wiki.resolution.de/doc/openid-oauth-authentication/latest/setup-guides/adfs-setup-guide:
服务器应用程序配置-Web API - 常规(添加为依赖方的服务器应用程序 ID)-Web API - 客户端权限-Web API 转换规则
从信赖方标识符中删除服务器应用程序标识符允许登录,但会忽略任何转换规则/访问控制策略,可能是因为 ADFS 无法将两个应用程序链接在一起。
其他选择
唯一支持使用 YubiKeys 进行身份验证的其他选项是 Azure AD,我们已经成功地将其用于其他各种应用程序。然而,问题是,我们想要进行身份验证的帐户(基础管理员)未同步到 Azure,以避免可能的攻击者在接管 Azure 的情况下也在我们的本地环境中立足。除非我忽略了什么,否则 AAD 不支持未同步用户的身份验证。
我是不是做错了什么,还是这个设置根本无法与不知道 ADFS 的应用程序一起使用?经过一番搜索,我发现在查询用户信息端点时,必须提供某种带有请求“urn...”值的“资源”参数,而我无法添加。
答案1
我能够/adfs/userinfo
按照以下步骤使端点正常工作:
/authorize
使用额外的查询参数键值对发出端点请求。resource=urn:microsoft:userinfo
我的完整请求如下所示:
GET /adfs/oauth2/authorize?client_id=<your-client-id>&response_type=code&redirect_uri=<your-redirect-url>&response_mode=query&scope=openid&resource=urn%3Amicrosoft%3Auserinfo
使用从 #1 收到的代码发出
/token
POST 请求。解码收到的 access_token 时,您应该看到密钥"aud"
等于"urn:microsoft:userinfo"
。您可以使用https://jwt.io解码你的access_token。/userinfo
使用 Bearer 授权标头中的访问令牌向您的端点发出请求。
注意
AD FS UserInfo 端点始终返回 OpenID 标准中指定的主题声明。AD FS 不支持通过 UserInfo 端点请求的其他声明。
来自ADFS 常见问题解答。