2017-10-16 97 views
0

我正在寻找一种方式来添加一个emails要求(电子邮件的集合),为Azure的AD B2C的自定义策略。此应用程序声明可从Azure门户直接获得,但我无法在需要创建的自定义策略中找到实现此方法的方法。Azure的AD B2C - “电子邮件”要求在定制策略

我要实现的是让Azure的AD B2C认证为我的Web应用程序的用户和Azure的AD身份验证自定义身份验证提供程序的员工,使这意味着我将需要添加emails要求两次 - 本地帐户和Azure的AD。

我跟着this guide to make custom policy所以我增加了一个新的ClaimsProvider到TrustFrameworkExtensions.xml文件。

当我下载注册&登录天青门户网站产生了以后,我可以看到下面的输出声明的政策:

<OutputClaim ClaimTypeReferenceId="emails" /> 

我试图把该行到我的自定义策略,但它不返回emails要求。

任何想法?

+1

哪里你是否试图在将它放入令牌之前获取电子邮件地址?它是一个Rest API,还是仅仅是一个本地帐户登录?如果你有一个新的技术资料,那么在问题中增加这个问题是很好的。否则,请提及初学者包和您的场景。 –

回答

0

我无法找到答案,这无论是 - 它看起来像“电子邮件”要求正在由一个自定义OutputClaimsTransformation返回,其中的配置不是样品中可用。

我没有找到,因此这个答案这帮助,但它涵盖更新“otherMails”要求为新用户,我对谁我不能以这种方式更新的基本方针政策的现有用户。

看来,电子邮件是由与“signInNames”数组中的第一项串联“otherMails”(社会注册等的情况下)填充。

我结束了做以下获得“电子邮件”要求动态创建的。

在TrustFrameworkExtensions.xml创建一个新的ClaimType

<ClaimType Id="emails"> 
    <DisplayName>Emails</DisplayName> 
    <DataType>stringCollection</DataType> 
    <UserHelpText>User's email addresses</UserHelpText> 
    </ClaimType> 

在TrustFrameworkExtensions.xml创建3个新ClaimsTransformations

<ClaimsTransformation Id="GetFirstOtherMail" TransformationMethod="GetSingleItemFromStringCollection"> 
    <InputClaims> 
     <InputClaim ClaimTypeReferenceId="otherMails" TransformationClaimType="collection" /> 
    </InputClaims> 
    <OutputClaims> 
     <OutputClaim ClaimTypeReferenceId="firstOtherMail" TransformationClaimType="extractedItem" /> 
    </OutputClaims> 
    </ClaimsTransformation> 

    <ClaimsTransformation Id="CopyFirstOtherMailToEmail" TransformationMethod="AddItemToStringCollection"> 
    <InputClaims> 
     <InputClaim ClaimTypeReferenceId="firstOtherMail" TransformationClaimType="item" /> 
     <InputClaim ClaimTypeReferenceId="emails" TransformationClaimType="collection" /> 
    </InputClaims> 
    <OutputClaims> 
     <OutputClaim ClaimTypeReferenceId="emails" TransformationClaimType="collection" /> 
    </OutputClaims> 
    </ClaimsTransformation> 

    <ClaimsTransformation Id="CopySignInNamesEmailToEmails" TransformationMethod="AddItemToStringCollection"> 
    <InputClaims> 
     <InputClaim ClaimTypeReferenceId="signInNames.emailAddress" TransformationClaimType="item" /> 
     <InputClaim ClaimTypeReferenceId="emails" TransformationClaimType="collection" /> 
    </InputClaims> 
    <OutputClaims> 
     <OutputClaim ClaimTypeReferenceId="emails" TransformationClaimType="collection" /> 
    </OutputClaims> 
    </ClaimsTransformation> 

创建TrustFrameworkExtensions.xml新TechnicalProfile:

<!-- The following technical profile is used to create the emails collection after user authenticates. --> 
    <TechnicalProfile Id="AAD-UserCreateEmailsClaim"> 
     <Metadata> 
     <Item Key="Operation">Read</Item> 
     <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item> 
     </Metadata> 
     <IncludeInSso>false</IncludeInSso> 
     <InputClaims> 
     <InputClaim ClaimTypeReferenceId="objectId" Required="true" /> 
     </InputClaims> 
     <OutputClaims> 
     <OutputClaim ClaimTypeReferenceId="emails" />   
     </OutputClaims> 
     <OutputClaimsTransformations> 
     <OutputClaimsTransformation ReferenceId="GetFirstOtherMail"/> 
     <OutputClaimsTransformation ReferenceId="CopySignInNamesEmailToEmails"/> 
     <OutputClaimsTransformation ReferenceId="CopyFirstOtherMailToEmail"/> 
     </OutputClaimsTransformations> 
     <IncludeTechnicalProfile ReferenceId="AAD-Common" /> 
    </TechnicalProfile> 

只是SignUpOrSignIn

<OrchestrationStep Order="8" Type="ClaimsExchange"> 
     <ClaimsExchanges> 
     <!-- create the emails claim combining signInNames and otherMails --> 
     <ClaimsExchange Id="AADUserCreateEmailsClaim" TechnicalProfileReferenceId="AAD-UserCreateEmailsClaim" /> 
     </ClaimsExchanges> 
    </OrchestrationStep> 


    <OrchestrationStep Order="9" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" /> 

编辑PolicyProfile TechnicalProfile最后一步(SendClaims)前添加一个新的OrchestrationStep到SignUpOrSignIn UserJourney并添加OutputClaim:

<OutputClaim ClaimTypeReferenceId="emails" />