繁体   English   中英

使用Azure AD B2C自定义身份提供程序(OpenID Connect)映射声明

[英]Mapping claims with Azure AD B2C Custom Identity Provider (OpenID Connect)

虽然,我已将所有声明映射设置得很好,以便它们与我们的Identity Server 3发出的声明映射匹配,但在Azure AD方面似乎没有这些值。 名称和电子邮件是可以用作示例的声明。 奇怪的是,这仅在自定义身份提供程序(Open ID Connect)中发生,而例如Facebook内置的身份提供程序运行良好并接受了从IdP收到的那些声明。 有没有做过这项工作的人?

[编辑]另外,我还尝试过以下建议的自定义策略: 如何将来自IdentityServer 3的声明存储在Azure AD B2C中,或者仅将其包含在AAD B2C发行的令牌中 现在,我面临着另一个问题,即使用自定义策略仅将AAD B2C连接到Identity Server 3。 这是我来自TrustFrameworkExnsion.xml的TechnicalProfile定义:

<TechnicalProfile Id="IdentityServerProfile">
    <DisplayName>IdentityServer</DisplayName>
    <Description>Login with your IdentityServer account</Description>
    <Protocol Name="OpenIdConnect"/>
    <OutputTokenFormat>JWT</OutputTokenFormat>
    <Metadata>
        <Item Key="METADATA">https://{identity_server_hostname}/identity/.well-known/openid-configuration</Item>
        <Item Key="ProviderName">https://{identity_server_hostname}/identity</Item>
        <Item Key="client_id">00000000-0000-0000-0000-000000000000</Item>
        <Item Key="IdTokenAudience">00000000-0000-0000-0000-000000000000</Item>
        <Item Key="response_types">code</Item>
        <Item Key="scope">openid profile customScope</Item>
        <Item Key="UsePolicyInRedirectUri">false</Item>
        <Item Key="AccessTokenResponseFormat">json</Item>
        <Item Key="HttpBinding">POST</Item>
    </Metadata>
    <CryptographicKeys>
        <Key Id="client_secret" StorageReferenceId="B2C_1A_IdentityServerAppSecret"/>
    </CryptographicKeys>
    <OutputClaims>      
        <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="IdentityServer" />
        <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
        <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="tid" />
        <OutputClaim ClaimTypeReferenceId="socialIdpUserId" PartnerClaimType="sub" />
    </OutputClaims>
    <OutputClaimsTransformations>
        <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
        <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
        <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
    </OutputClaimsTransformations>
    <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop"/>
</TechnicalProfile>

基本上,在IdentityServer端进行身份验证之后,我被重定向回我的网页,该网页初始化了登录,然后出现此错误:AADB2C:发生了异常。 相关ID:6797f691-4adb-4963-ad12-f31add3e1919时间戳:2018-08-23 08:42:54Z

在分析给定相关性ID的AAD B2C上的日志时,我没有找到任何有用的方法来引导我找到可能的解决方案。

昨天,在花了很长时间尝试许多不同的事情之后,我终于明白了为什么我们没有把所有索偿都归还给客户。 它们实际上不存在于身份令牌中,而仅存在于访问令牌中。 AAD B2C在执行自定义策略中定义的映射时使用了第一个身份标识令牌,这就是重点。 最后,我不得不在IdentityServer3方面进行一些小的更改(请看下面的代码)。

这就是负责发出声明并生成身份和访问令牌的类现在的样子:

public class CustomClaimsProvider : DefaultClaimsProvider

{私人唯读IIndex ClaimDefinitions;

public CustomClaimsProvider(
    IUserService users,
    IIndex<string, IClaimsDefinition> claimDefinitions)
    : base(users)
{
    this.claimDefinitions = claimDefinitions;
}

public override async Task<IEnumerable<Claim>> GetIdentityTokenClaimsAsync(
   ClaimsPrincipal subject,
   Client client,
   IEnumerable<Scope> scopes,
   bool includeAllIdentityClaims,
   ValidatedRequest request)
{
    var claims = await base.GetIdentityTokenClaimsAsync(subject, client, scopes, includeAllIdentityClaims, request).ConfigureAwait(false);
    return GetAdditionalClaims(scopes, claims);
}

public override async Task<IEnumerable<Claim>> GetAccessTokenClaimsAsync(
    ClaimsPrincipal subject,
    Client client,
    IEnumerable<Scope> scopes,
    ValidatedRequest request)
{
    var claims = await base.GetAccessTokenClaimsAsync(subject, client, scopes, request).ConfigureAwait(false);
    return GetAdditionalClaims(scopes,  claims);
}

private IEnumerable<Claim> GetAdditionalClaims(IEnumerable<Scope> scopes, IEnumerable<Claim> claims)
{
    var scopesList = scopes.ToList();
    var claimsList = claims.ToList();

    foreach (var scope in scopesList.Select(x => x.Name))
    {
        if (claimDefinitions.TryGetValue(scope, out IClaimsDefinition claimDef))
        {
            claimsList.AddRange(claimDef.GetClaims(claims));
        }
    }

    return claimsList;
}

}

因此,主要要点是,如果您希望将一些其他声明作为身份令牌的一部分,则还应该重写从DefaultClaimsProvider派生的类中的GetIdentityTokenClaimsAsync方法。

非常感谢Microsoft支持,它为我解决问题提供了很多帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM