Active directory ADFS+;OpenID连接电子邮件声明和外部ADF

Active directory ADFS+;OpenID连接电子邮件声明和外部ADF,active-directory,adfs,openid-connect,windows-server-2016,Active Directory,Adfs,Openid Connect,Windows Server 2016,在Windows Server 2016上使用OpenID Connect设置ADF时遇到困难 我已经为测试设置了AD,我可以成功地进行身份验证,但是id令牌中没有电子邮件声明 此外,我还在索赔提供者信托中设置了一个外部ADFS。它显示为一个选项,但在登录时,我会收到以下错误: MSIS9642: The request cannot be completed because an id token is required but the server was unable to con

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

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

此外,我还在索赔提供者信托中设置了一个外部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.

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

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

索赔提供者信任模型中添加了一个名为AnchorClaimType的新属性

首次安装ADFS时,它会为AD授权注册内置索赔提供商信任,并将AnchorClaimType的值设置为

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

通过使用powershell命令获取adfsclaimsprovidertrust可以看到这一点

这就是为什么OpenID在针对Active Directory进行身份验证时适用

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

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

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

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

c) 将索赔提供程序信任的锚定类型索赔设置为使用powershell选择的类型

设置adfsclaimsprovidertrust-targetidentifier标识符-AnchorClaimType名称

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

d) 在案例名称中,至少创建一个传入规则,该规则传递主输入声明的值


希望这有助于解决缺少附加索赔提供者信任(CPT)的AnchorClaimType参数的问题。可以使用Windows Server 2016 TP5的解决方法(直到支持结束)

解决方法:

  • 如果CPT已经存在,请删除该CPT
  • 使用powershell命令添加AdfsClaimsProviderTrust
    • 任意参数(请参阅)
    • 或者使用元数据URL+参数-AnchorClaimType“yourAnchorClaimValue”
  • 至少创建一个传入规则,该规则传递主输入声明的值
  • 在我的情况下,以下PS命令解决了问题:

    [String]$ClaimProviderTrustName = "YourCPTName"
    [String]$MetaDataURL = "https://..."
    [String]$AnchorClaimType = "YourAnchorClaimValue"
    Add-AdfsClaimsProviderTrust -Name $ClaimProviderTrustName -MetadataUrl $MetaDataURL -AnchorClaimType $AnchorClaimType
    

    我不得不使用foo://而不是http://因为内容被解释为链接……我知道这是一个旧线程,但有必要在外部ADF中进行任何配置吗?我尝试了许多AnchorClaimType,但都返回了相同的错误。然而,我可以得到一个令牌(没有任何用户信息)。我还为应用程序组和通过所有索赔的索赔提供者信任创建了一个自定义规则:c:[]=>issue(索赔=c);