Azure AD B2C OpenID Connect 和 SAML 2.0 读取角色声明

Azure AD B2C OpenID Connect and SAML 2.0 read role claims

AD FS 使用 SAML 2.0 配置了自定义策略作为 Azure AD B2C 上的声明提供程序。 Azure AD B2C 上的依赖方正在使用 OpenID Connect。

AD FS 发出包含角色声明的 SAML 2.0 断言。如果角色在两个单独的属性元素中返回:

<saml:Attribute Name="http://test.com/claims/role">
  <saml:AttributeValue>role1</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute Name="http://test.com/claims/role">
  <saml:AttributeValue>role2</saml:AttributeValue>
</saml:Attribute>

Azure AD B2C 仅读取最后一个声明。

否则,如果角色作为一个 Attribute 元素中的 AttributeValue 元素返回:

<saml:Attribute Name="http://test.com/claims/roles">
  <saml:AttributeValue>role1</saml:AttributeValue>
  <saml:AttributeValue>role2</saml:AttributeValue>
</saml:Attribute>

读取所有角色值。

使用的 Azure AD B2C 角色 ClaimType 是:

<ClaimType Id="role">
  <DisplayName>Role</DisplayName>
  <DataType>string</DataType>
  <DefaultPartnerClaimTypes>
    <Protocol Name="OAuth2" PartnerClaimType="role" />
    <Protocol Name="OpenIdConnect" PartnerClaimType="role" />
    <Protocol Name="SAML2" PartnerClaimType="http://test.com/claims/role" />
  </DefaultPartnerClaimTypes>
  <UserHelpText/>
</ClaimType> 

<ClaimType Id="roles">
  <DisplayName>Roles</DisplayName>
  <DataType>stringCollection</DataType>
  <DefaultPartnerClaimTypes>
    <Protocol Name="OAuth2" PartnerClaimType="roles" />
    <Protocol Name="OpenIdConnect" PartnerClaimType="roles" />
    <Protocol Name="SAML2" PartnerClaimType="http://test.com/claims/roles" />
  </DefaultPartnerClaimTypes>
  <UserHelpText/>
</ClaimType> 

SAML 2.0 既支持发送多个同名属性,也支持发送一个带有 AttributeValue 列表的属性。 有没有办法让 Azure AD B2C 读取多个同名属性,而不仅仅是最后一个?

我通过在 AD FS 和 Azure AD B2C 之间添加自定义 SAML 2.0 代理解决了这个问题。 SAML 2.0 代理是 AD FS 上的依赖方 (RP) 和 Azure AD B2C 的身份提供者 (IdP)。通过这种方式,可以转换声明并使用 Azure AD B2C 支持的声明结构颁发 nye SAML 2.0 令牌。

SAML 2.0 代理的 RP 和 IdP 部分都可以使用 ITfoxtec.Identity.Saml2 包实现。