4

我在 Windows Server 2016 上使用 OpenID Connect 设置 ADFS 时遇到困难。

我已经为测试设置了 AD,并且可以成功进行身份验证,但是电子邮件声明不在 id 令牌中。

此外,我在 Claims Provider 信任中设置了一个外部 ADFS。它显示为一个选项,但是在登录时出现错误:

    MSIS9642: The request cannot be completed because an id token is required but the server was unable to construct an id token for the current user.

有人对如何解决这个问题有建议吗?

4

2 回答 2

13

MSIS9642的根本原因是 ADFS 2016 中的新 OpenID Connect 应用程序组功能需要向您的应用程序颁发访问令牌。此令牌必须包含用户身份。为了发布令牌​​,子系统必须了解入站声明中的哪个声明用于唯一标识用户。

一个名为AnchorClaimType的新属性已添加到 Claim Provider Trust 模型中。

首次安装 ADFS 时,它会为 AD AUTHORITY 注册内置的 Claim Provider Trust 并将AnchorClaimType的值设置为

foo: //schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname

您可以使用 powershell 命令get-adfsclaimsprovidertrust看到这一点。

这就是 OpenID 在针对 Active Directory 进行身份验证时适用的原因。

当您创建新的 Claim Provider Trust 时,系统不会设置AnchorClaimType。OpenID 系统无法颁发令牌,因为它不知道哪个入站声明构成唯一用户身份。这就是为什么 OpenID 在针对外部声明提供者信任进行身份验证时不起作用的原因。

为了解决这个问题,您需要采取一些措施:

a) 验证您正在运行Windows Server 2016 RTM不幸的是,用于设置 AnchorClaimType 的 powershell 属性在 CTP 中不存在,并且无法使用 UI 设置该属性。

b) 从代表用户身份的入站令牌中选择一个声明并标识声明类型。在我们的例子中,我们与 Azure Active Directory 联合并选择了name,类型为 foo://schemas.xmlsoap.org/ws/2005/05/identity/claims/ name

c) 将 Claim Provider Trust 的AnchorTypeClaim设置为使用 powershell 选择的类型

set-adfsclaimsprovidertrust -targetidentifier标识符-AnchorClaimType http://schemas.xmlsoap.org/ws/2005/05/identity/claims/名称

(从 powershell get-adfsclaimsprovidertrust获取标识符)

d) 创建至少一个通过主要输入声明的值的入站规则,在我们的例子中为名称

希望这可以帮助

于 2016-10-14T16:30:10.857 回答
0

要解决缺少AnchorClaimType参数以增加额外的声明提供程序信任 (CPT) 的问题,可以使用Windows Server 2016 TP5(直到支持结束)的解决方法。

解决方法:

  1. 如果 CPT 已存在,请删除 CPT。
  2. 使用 powershell 命令 Add-AdfsClaimsProviderTrust
    • 参数明智(请参阅Technet 说明
    • 或者使用元数据 URL + 参数 -AnchorClaimType "yourAnchorClaimValue"。
  3. 创建至少一个通过主要输入声明的值的入站规则

在我的例子中,下面的 PS 命令解决了这个问题:

[String]$ClaimProviderTrustName = "YourCPTName"
[String]$MetaDataURL = "https://..."
[String]$AnchorClaimType = "YourAnchorClaimValue"
Add-AdfsClaimsProviderTrust -Name $ClaimProviderTrustName -MetadataUrl $MetaDataURL -AnchorClaimType $AnchorClaimType
于 2016-11-23T15:06:51.407 回答