Получение электронной почты после входа в Azure AD в Azure AD B2C
Сценарий: я использую Angular 5 для внешнего интерфейса и.NET core 2.0 для внутреннего, MSAL.js для проверки подлинности в Azure AD B2C в Angular SPA, затем использую возвращенный id_token
как токен на предъявителя для отправки запросов на конечные точки WebAPI.
Я успешно настроил мультитенантную Azure AD в качестве поставщика в Azure AD B2C (см. Ответ здесь " Мультитенантная Azure AD в Azure AD B2C"), но в id_token
, нет никаких претензий по адресу электронной почты. Примечание. Если я настраиваю Azure AD с одним владельцем, я получаю обратно претензию с типом http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
для адреса электронной почты, но не смог сделать это с мультитенантной AD.
Я считаю, что ограничение относится к Azure AD v2.0, о котором упоминалось здесь: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-limitations
Вопрос: Как я могу получить адрес электронной почты пользователя после входа в систему.
Я следовал рекомендациям в этой статье https://monteledwards.com/2017/10/18/a-complete-integration-azure-ad-b2c-azure-ad-graph-api-logic-apps/ чтобы добавить дополнительную логику приложение для разрешения электронной почты от id_token
, но моя проблема в том, что у меня нет objectId
назад тоже.
Заявления, которые я получил после успешной аутентификации:
iss - https://login.microsoftonline.com/<My-B2C-Tenant-Id>/v2.0/
exp - ticks
nbf - ticks
aud - My-B2C-App-Id
name - string
http://schemas.microsoft.com/identity/claims/identityprovider - tid
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier - My-B2C-App-Id
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname - string
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname - string
nonce - GUID
http://schemas.microsoft.com/identity/claims/scope - User.Read
azp - GUID
ver - 1.0
iat - ticks
Мой технический профиль для мультитенантного Azure AD -> Azure AD B2C:
<TechnicalProfile Id="AzureADAccountProfile">
<DisplayName>Log in with your work account</DisplayName>
<Protocol Name="OpenIdConnect"/>
<OutputTokenFormat>JWT</OutputTokenFormat>
<Metadata>
<Item Key="authorization_endpoint">https://login.microsoftonline.com/common/oauth2/v2.0/authorize</Item>
<Item Key="client_id">My ID</Item>
<Item Key="DiscoverMetadataByTokenIssuer">true</Item>
<Item Key="HttpBinding">POST</Item>
<Item Key="IdTokenAudience">My ID</Item>
<Item Key="response_types">id_token</Item>
<Item Key="scope">openid profile</Item>
<Item Key="UsePolicyInRedirectUri">false</Item>
<Item Key="ValidTokenIssuerPrefixes">https://login.microsoftonline.com/</Item>
</Metadata>
<CryptographicKeys>
<Key Id="client_secret" StorageReferenceId="B2C_1A_AzureADSecret"/>
</CryptographicKeys>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="enterpriseAuthentication" />
<OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
<OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="tid" />
<OutputClaim ClaimTypeReferenceId="socialIdpUserId" PartnerClaimType="oid" />
<OutputClaim ClaimTypeReferenceId="tenantId" PartnerClaimType="tid"/>
<OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="unique_name" />
<OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="given_name" />
<OutputClaim ClaimTypeReferenceId="surName" PartnerClaimType="family_name" />
<OutputClaim ClaimTypeReferenceId="tenant" />
</OutputClaims>
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
<OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
<OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
</OutputClaimsTransformations>
<UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>
1 ответ
Получение адреса электронной почты, связанного с учетной записью пользователя, отличается в зависимости от учетной записи пользователя / личной учетной записи и учетной записи организации / рабочей станции.
Персональный аккаунт
Ссылка: ссылка на токены Azure Active Directory v2.0
Адрес электронной почты, связанный с учетной записью пользователя, может быть указан в идентификационном токене.
1) Измените элемент метаданных "scope" с "openid profile" на "email профиля openid".
<Metadata>
<Item Key="scope">openid profile email</Item>
</Metadata>
2) Измените претензию по электронной почте с:
<OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="unique_name" />
чтобы:
<OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
Рабочий аккаунт
Адрес электронной почты, связанный с учетной записью пользователя, должен быть получен с помощью Microsoft Graph API.
1) Измените технический профиль "AzureADAccountProfile" с "OpenIdConnect" на "OAuth2" и добавьте элементы метаданных, чтобы получить свойства профиля для вошедшего в систему пользователя.
Примечание. Операция "Получить пользователя" не возвращает идентификатор арендатора вошедшего в систему пользователя, поэтому следующий технический профиль создает утверждение "identityProvider", которое требуется для альтернативного идентификатора безопасности, из доменной части "userPrincipalName"свойство этого пользователя.
<TechnicalProfile Id="AzureADAccountProfile">
<DisplayName>Log in with your work account</DisplayName>
<Protocol Name="OAuth2"/>
<OutputTokenFormat>JWT</OutputTokenFormat>
<Metadata>
<Item Key="AccessTokenEndpoint">https://login.microsoftonline.com/organizations/oauth2/v2.0/token</Item>
<Item Key="authorization_endpoint">https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize</Item>
<Item Key="BearerTokenTransmissionMethod">AuthorizationHeader</Item>
<Item Key="ClaimsEndpoint">https://graph.microsoft.com/v1.0/me</Item>
<Item Key="client_id"><!-- Enter your client ID --></Item>
<Item Key="DiscoverMetadataByTokenIssuer">true</Item>
<Item Key="HttpBinding">POST</Item>
<Item Key="IdTokenAudience"><!-- Enter your client ID --></Item>
<Item Key="response_types">code</Item>
<Item Key="scope">https://graph.microsoft.com/user.read</Item>
<Item Key="UsePolicyInRedirectUri">false</Item>
<Item Key="ValidTokenIssuerPrefixes">https://login.microsoftonline.com/</Item>
</Metadata>
<CryptographicKeys>
<Key Id="client_secret" StorageReferenceId="B2C_1A_AzureADSecret"/>
</CryptographicKeys>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="enterpriseAuthentication" />
<OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="displayName" />
<OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="mail" />
<OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="givenName" />
<OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="surname" />
<OutputClaim ClaimTypeReferenceId="socialIdpUserId" PartnerClaimType="id" />
<OutputClaim ClaimTypeReferenceId="userPrincipalName" PartnerClaimType="userPrincipalName" />
</OutputClaims>
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="CreateAzureADIdentityProvider" />
<OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId" />
<OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName" />
<OutputClaimsTransformation ReferenceId="CreateUserPrincipalName" />
</OutputClaimsTransformations>
<UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>
2) Создайте преобразование утверждений CreateAzureADIdentityProvider.
<ClaimsTransformation Id="CreateAzureADIdentityProvider" TransformationMethod="ParseDomain">
<InputClaims>
<InputClaim ClaimTypeReferenceId="userPrincipalName" TransformationClaimType="emailAddress" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="identityProvider" TransformationClaimType="domain" />
</OutputClaims>
</ClaimsTransformation>