本文提供了修复 Active Directory 联合服务 (AD FS) 2.0 错误的解决方案。
原始 KB 数: 3044977
总结
大多数 AD FS 2.0 问题属于以下主要类别之一。 本文包含用于排查声明规则问题的分步说明。
现象
AD FS 服务颁发的令牌没有适当的声明来授权用户访问应用程序。
AD FS 服务器返回以下错误消息:
拒绝访问
如果使用“配置 ADFS 服务器进行故障排除”主题启用 AD FS 审核,则事件日志中记录了以下错误:
事件 ID 325
联合身份验证服务无法授权调用方颁发令牌。
解决方法
若要解决此问题,请按给定的顺序执行以下步骤。 这些步骤将帮助你确定问题的原因。 确保检查每个步骤后是否解决问题。
步骤 1:获取有关所需声明的详细信息
- 从信赖方所有者确定 SAML 令牌中需要哪些声明类型。
- 确定用于对用户进行身份验证的声明提供程序。
例如:
信赖方提供程序可能指示它希望提供用户的电子邮件、名称和角色值。
如果在这种情况下声明提供程序为“Active Directory”,则应在“Active Directory”级别配置接受声明规则。
注意
如果声明提供程序是另一个安全令牌服务(STS),则必须创建传递或转换声明规则,以接受要传递给信赖方的本地定义的声明类型中的声明值。
在信赖方级别为这些声明创建直通声明。
步骤 2:检查 AD FS 是否基于授权规则拒绝令牌
为此,请右键单击信赖方,单击“ 编辑声明规则”,然后单击“ 颁发授权规则 ”选项卡。检查规则信息时,请考虑以下准则:
- 将处理所有授权声明规则。
- 如果未定义任何规则,AD FS 服务器将拒绝所有用户。
- 还可以使用允许列表方法,而不是使用“允许所有”规则。 在这种情况下,请定义一组规则,这些规则指定用户必须颁发令牌的条件。
- 在阻止列表方法中,需要一个“允许所有规则”,以及一个或多个基于条件的拒绝规则。
- 拒绝规则始终替代允许规则。 这意味着,如果用户的“允许”和“拒绝”声明条件均为 true,则会遵循“拒绝”规则。
- 对于基于其他声明值来允许或拒绝令牌的授权规则,应已从声明提供程序信任级别将这些声明推送到声明管道中。
步骤 3:捕获 Fiddler 跟踪
捕获 Fiddler Web 调试器跟踪以捕获与 AD FS 服务的通信,并确定是否颁发了 SAML 令牌。 如果颁发了 SAML 令牌,请对令牌进行解码,以确定是否颁发了正确的声明集。
有关此过程的详细信息,请参阅 AD FS 2.0:如何使用 Fiddler Web 调试器分析 WS 联合被动登录。
若要查找 AD FS 服务颁发的 SAML 令牌,请执行以下操作:
- 在 fiddler 跟踪中,查看 AD FS 的响应,以确定 AD FS 服务设置 MSISAuth 和 MSISAuthenticated Cookie 的位置。 或者,在 AD FS 设置 MSISAuth 和 MSISAuthenticated Cookie 后查看请求。
- 选择令牌,然后在 Fiddler 中启动 TextWizard。 将 URLDecode 用于 RSTR(WS-Fed)或 FromDeflatedSAML 作为 SAML 2.0 协议响应。
步骤 4:启用 ADFS 审核并检查令牌是否已颁发或拒绝,以及正在处理的声明列表
将 AD FS 服务器配置为将 AD FS 事件的审核记录到安全日志。 若要配置Windows 安全日志以支持 AD FS 事件的审核,请执行以下步骤:
- 单击“开始”,指向管理工具,然后单击“本地安全策略”。
- 双击“本地策略”,然后单击“审核策略”。
- 在详细信息窗格中,双击“ 审核对象访问”。
- 在“审核对象访问属性”页上,选择“成功”或“失败”,然后单击“确定”。
- 关闭本地安全设置管理单元。
- 在命令提示符下,键入 gpupdate /force,然后按 Enter 立即刷新本地策略。
还可以使用以下 GPO 配置Windows 安全日志:
计算机配置\策略\Windows 设置\安全设置\高级审核策略配置\审核策略\对象访问\审核应用程序生成 - 成功和失败配置 ADFS
这在 AD FS 拒绝用户令牌的情况下非常有用。 AD FS 审核过程将报告在拒绝令牌之前生成的事件和声明。 这有助于确定哪个声明导致应用拒绝规则。 检查安全事件日志,特别是针对事件 ID 299、500、501 和 325。
步骤 5:确定是否需要自定义声明
如果默认声明规则模板无法满足声明颁发要求,则可能需要编写自定义声明。 有关详细信息,请参阅 了解 AD FS 2.0 及更高中的声明规则语言。
第三方信息免责声明
本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。