Multi tenant Azure B2 C Login - как получить адрес электронной почты внешнего пользователя - PullRequest
0 голосов
/ 12 июля 2020

Я изо всех сил пытаюсь понять, как настроить Azure B2 C для мультитенантной аутентификации, в частности для получения доступа к адресу электронной почты пользователя, который входит в систему через внешний Azure AD (мы ' Мы заинтересованы в том, чтобы наши клиенты могли входить в систему либо через «Локальную учетную запись» (адрес электронной почты, управляемый B2 C), либо через свой собственный Azure AD).

Ключевая часть проблемы, на которой я Попытка привести к передаче адреса электронной почты вошедшего в систему пользователя через конечную точку REST, где нашему приложению нужно сделать некоторые внутренние действия, чтобы ввести дополнительные заявки c, указанные в приложении, которые используются позже. Помимо того, что наша конечная точка REST получает адрес электронной почты, все остальное работает.

У меня есть технический профиль "Common AAD", подобный этому:

<TechnicalProfile Id="Common-AAD">
    <DisplayName>Work Account</DisplayName>
    <Description>Login with your Work Account</Description>
    <Protocol Name="OpenIdConnect"/>
    <Metadata>
    <Item Key="METADATA">https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration</Item>
    <Item Key="client_id">my_client_id</Item>
    <Item Key="response_types">code</Item>
    <Item Key="scope">openid email profile</Item>
    <Item Key="response_mode">form_post</Item>
    <Item Key="HttpBinding">POST</Item>
    <Item Key="UsePolicyInRedirectUri">false</Item>
    <Item Key="DiscoverMetadataByTokenIssuer">true</Item>
    <Item Key="ValidTokenIssuerPrefixes">https://login.microsoftonline.com/</Item>
    </Metadata>
    <CryptographicKeys>
    <Key Id="client_secret" StorageReferenceId="B2C_1A_AADAppSecret"/>
    </CryptographicKeys>
    <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="oid"/>
    <OutputClaim ClaimTypeReferenceId="tenantId" PartnerClaimType="tid"/>
    <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name" />
    <OutputClaim ClaimTypeReferenceId="surName" PartnerClaimType="family_name" />
    <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
    <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" AlwaysUseDefaultValue="true" />
    <OutputClaim ClaimTypeReferenceId="identityProvider" PartnerClaimType="iss" />
    <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
    <OutputClaim ClaimTypeReferenceId="signInName" />
    <OutputClaim ClaimTypeReferenceId="otherMails" />
    <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" />
    <OutputClaim ClaimTypeReferenceId="upn" PartnerClaimType="upn" />
    </OutputClaims>
    <OutputClaimsTransformations>
    <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
    <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
    <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
    <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/>
    </OutputClaimsTransformations>
    <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin"/>
</TechnicalProfile>

В оркестровке я Я приказываю B2 C передать кучу этих утверждений в REST API, размещенный в приложении, чтобы мы могли выполнять нашу внутреннюю обработку:

<TechnicalProfile Id="REST-GetProfile-Dev">
    <DisplayName>Do some custom logic</DisplayName>
    <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    <Metadata>
        <Item Key="ServiceUrl">https://the-endpoint.com</Item>
        <Item Key="AuthenticationType">None</Item>
        <!-- REMOVE the following line in production environments -->
        <Item Key="AllowInsecureAuthInProduction">true</Item>
    </Metadata>
    <InputClaims>
        <!-- Claims sent to your REST API -->
        <InputClaim ClaimTypeReferenceId="objectId" />
        <InputClaim ClaimTypeReferenceId="email" />
        <InputClaim ClaimTypeReferenceId="sub" />
        <InputClaim ClaimTypeReferenceId="signInNames.emailAddress" />
        <InputClaim ClaimTypeReferenceId="userPrincipalName" />
        <InputClaim ClaimTypeReferenceId="displayName" />
        <InputClaim ClaimTypeReferenceId="otherMails" />
        <InputClaim ClaimTypeReferenceId="upnUserName" />
        <InputClaim ClaimTypeReferenceId="alternativeSecurityId" />
        <InputClaim ClaimTypeReferenceId="upn" />
        <InputClaim ClaimTypeReferenceId="signInName" />
        <InputClaim ClaimTypeReferenceId="socialIdpUserId" />

        <InputClaim ClaimTypeReferenceId="identityProvider" />
        <InputClaim ClaimTypeReferenceId="authenticationSource" />
    </InputClaims>
    <OutputClaims>
        <!-- bunch of app specific claims -->
    </OutputClaims>
    <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>

Однако я никогда не могу получить адрес электронной почты , или что-нибудь, что содержит адрес электронной почты вошедшего в систему пользователя, проходящего через.

Я пытался отследить обработку, которая определена в файлах Custom Policy XML, и это сложно. Честно говоря, я исследовал это и пробовал добавлять всевозможные дополнительные утверждения к результатам различных этапов, но у меня это просто не работает.

Любая помощь в подробностях того, как получить адрес электронной почты был бы очень признателен пользователь, вошедший через внешний Azure AD, переданный на этап оркестрации REST.

Спасибо.

** Big Edit **

В ответ Джасу Сури, я все сбросил, применил приведенные ниже изменения, как было предложено, но я все еще не вижу этой работы.

Вот моя TrustFrameworkBase. xml: TrustFrameworkBase. xml

Вот мои TrustFrameworkExtensions. xml: TrustFrameworkExtensions. xml

Вот моя Проверяющая сторона (SignInSignUpMulti. xml) файл: SignInSignUpMulti. xml

Теперь, глядя на мой сценарий ios:

Когда я вхожу в систему с «локальной» учетной записью, я увидеть, как этот тип информации передается в мою конечную точку отдыха во время путь пользователя:

{
    "objectId": "1e91bfba-17a1-43b6-a451-9896fc3c1061",
    "signInNames.emailAddress": "email@example.com",
    "displayName": "User DispName",
    "signInName": "email@example.com",
    "authenticationSource": "localAccountAuthentication"
}

Это идеально . Я могу взять эту информацию и собрать дополнительные требования для возврата, и все будет работать именно так, как я хочу.

Когда я вхожу в учетную запись AD, привязанную к my org, я получаю следующее:

{
    "objectId": "a_guid",
    "sub": "Not supported currently. Use oid claim.",
    "userPrincipalName": "cpim_a_guid@TENANT.onmicrosoft.com",
    "displayName": "ThisIs Correct",
    "upnUserName": "14218711-5dd1-4a81-8e04-77bd08298aaf",
    "alternativeSecurityId": "{\"type\":6,\"identityProvider\":\"https://login.microsoftonline.com/a_guid/v2.0\",\"key\":\"a_key\"}",
    "identityProvider": "https://login.microsoftonline.com/a_guid/v2.0",
    "authenticationSource": "socialIdpAuthentication"
}

Мне не хватает адреса электронной почты (или адреса для входа пользователей).

То же самое происходит, когда я пытаюсь войти в систему как внешний AD:

{
    "objectId": "a_guid",
    "sub": "Not supported currently. Use oid claim.",
    "userPrincipalName": "cpim_a_guid@TENANT.onmicrosoft.com",
    "displayName": "ThisIs Correct",
    "upnUserName": "9c865de4-2898-4b18-998b-7fa151f6623d",
    "alternativeSecurityId": "{\"type\":6,\"identityProvider\":\"https://login.microsoftonline.com/a_guid/v2.0\",\"key\":\"a_key\"}",
    "identityProvider": "https://login.microsoftonline.com/a_guid/v2.0",
    "authenticationSource": "socialIdpAuthentication"
}

Если я смогу решить, как пройти через адрес электронной почты или адрес для входа, я был бы очень счастлив.

Событие во время отладки, если я все равно заставлю пользователя войти в систему, я проверю User.Identity, и хотя я вижу утверждения о том, что мой rest api возвращается во время путешествия, у меня все еще нет претензий, похожих на адрес электронной почты, который я ожидаю (надеюсь) увидеть. Я определенно могу работать в любом случае - адрес электронной почты, переданный в REST API, или адрес электронной почты, указанный в последнем наборе утверждений, который получает приложение.

Любая помощь будет очень признательна.

1 Ответ

1 голос
/ 12 июля 2020

Начиная с Azure AD, все пользователи будут возвращаться с заявлением unique_name, которое является UPN в их Azure AD. На это тоже можно положиться. Если вы полагаетесь на заявку по электронной почте от AAD, она будет присутствовать только в том случае, если у пользователя есть почтовый ящик Exchange Online. Вы также должны настроить его в качестве необязательного запроса Azure AD при регистрации приложения AAD Multi Tenant.

Обычно UPN и адрес электронной почты в Azure AD совпадают. Итак, в техническом профиле AAD вы можете добавить это выходное утверждение для захвата UPN AAD:

<OutputClaim ClaimTypeReferenceId="aadUPN" PartnerClaimType="unique_name"/>

Затем в разделе проверяющей стороны добавьте это выходное утверждение:

<OutputClaim ClaimTypeReferenceId="aadUPN" PartnerClaimType="UPNfromAAD"/>
...