我正在尝试使用OIDC和授权代码流来实现一个web应用程序。我使用OIDC Core 1.0规范作为应该如何工作的参考。我正试图在Microsoft ADFS 2016服务器上实现这一点,该服务器通常声称支持OIDC。
除了一个例外,我已经设法使工作流程在大部分情况下正常工作。当我调用令牌端点以将我的授权码交换为access_token
和id_token
时,我希望通过name
声明获得用户的可显示名称。但我从ADFS收到的代币中没有这种说法。
当我重定向到ADFS服务器的授权端点时,我会将openid profile
的scope
值传递给它。根据OIDC规范第5.4节,profile
范围应导致请求name
索赔。但我没有收到这种说法。我确实得到了一些我可以考虑使用的其他声明(即upn
或unique_name
),但我正在尽可能地与标准保持一致。
这是否意味着ADFS 2016在这一特定领域不符合OIDC规范?还是我读错了我在这里引用的规范章节?
如第18节所述,与名称相关的标准声明通常是given_name
和family_name
,我总是尝试根据这些值对应用程序进行编码,因此您的担忧是正确的。
作为消费者,您还应该能够选择这些索赔的发放地点。然而,提供者通常不完全符合标准,因此您可能需要稍微调整代码。
这是一篇关于定制ADFS索赔的MS文章,尽管它可能不会让你清楚地了解索赔应该如何工作。
更多信息
在高层,以下是OAuth系统发布声明的方式:
- 用户进行身份验证(也可以授予同意)
- 授权服务器在其数据库中记录此"委派",以及相关的声明和作用域
- 应用程序可以控制声明的公开方式和位置,例如哪些令牌或端点包括它们
有关更多信息,请参阅这篇关于个人身份信息(PII)的文章,并了解索赔映射器如何在Curity系统中工作。
你的ADFS提供商可能没有给你完全的控制权,但值得注意的是设计模式,并尽可能减少代币中的用户信息。
虽然我看到的一切都指向Server 2016上的ADFS 4,支持标准OIDC范围/声明,如电子邮件和;个人资料,在实践中,我没能做到这一点。
我确实找到了解决办法:
- 请确保您在应用程序中使用的是令牌端点(而不是userinfo端点)。(如果要从另一个平台设置联盟,请确保未设置userinfo端点)
- 在ADFS中打开应用程序的Web API属性,方法是打开ADFS管理工具>选择";应用程序组";从导航窗格>双击应用程序的名称>双击关联的Web API的名称
- 选择";客户端权限";选项卡,然后选中";allatclaims";复选框中的";允许的范围:;部分
- 选择";"发布转换规则";选项卡,然后选择";添加规则"按钮(如果您有现有的规则,您可以修改或删除它们)
- 选择";将LDAP属性作为声明发送";从下拉列表中;下一步>quot;按钮
- 为规则命名
- 从";属性存储:"下拉列表
- 将您希望与索赔一起发送的属性添加到";LDAP属性到传出声明类型的映射:;部分在左侧框中输入要发送的AD属性的名称(您可以键入以快速查找),然后在右侧框中输入您希望发送的传出索赔的名称
例如:type"邮件";在左框中选择";电子邮件地址";AD属性,然后键入"AD";电子邮件";在右侧框中发送属性作为";电子邮件";。
- 添加完要添加的任何属性后,单击;完成";按钮
- 接下来单击";OK";"Web API属性"窗口上的按钮保存更改
- 最后,单击";OK";按钮
我仍然不确定为什么这不符合我的预期,我的所有设置似乎都是正确的。不过,我看到很多人问这个问题,所以我希望这能帮助其他人。
如果有人知道为什么2016服务器上的ADFS 4.0没有按预期工作,请在评论中告诉我!