Получение адреса электронной почты пользователя из Azure AD через OpenID Connect

Я пытаюсь аутентифицировать пользователей на моем сайте с их учетными записями Office 365, поэтому я следовал инструкциям по использованию промежуточного программного обеспечения OWIN OpenID Connect для добавления аутентификации и успешно сумел аутентифицировать и получить их профиль.

теперь я пытаюсь получить адрес электронной почты пользователя (чтобы я мог заполнить их системную учетную запись своими контактными данными), но я не могу получить заявку по электронной почте. Я попытался сделать запрос, используя область openid profile email, но набор утверждений не содержит никакой почтовой информации.

есть ли способ получить электронную почту пользователя из Azure AD через конечную точку OpenID Connect?

3 ответов


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

  1. включить profile или email область в вашем запросе и
  2. настройте приложение в разделе Azure Portal Active Directory для включения Войдите и прочитайте Профиль пользователя под делегирован Разрешения.

обратите внимание, что адрес электронной почты не может быть возвращен в email claim: в моем случае (как только я получил его работу) он возвращается в name претензии.

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

нет адреса электронной почты, связанного с учетной записью Azure AD

согласно этому руководству к области, разрешения и согласие в Azure Active Directory v2.0 конечная точка, даже если email область вы не можете получить адрес электронной почты обратно:

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

если вы получаете другие, связанные с профилем претензии обратно (как given_name и family_name), это может быть проблема.

претензии, отброшенные middleware

это было причиной для меня. Я не получал любой претензии, связанные с профилем (имя, фамилия, имя пользователя, электронная почта и т. д.).

в моем случае стек обработки идентификаторов выглядит так это:

проблема была в IdentityServer3.AspNetIdentity AspNetIdentityUserService класс:InstantiateNewUserFromExternalProviderAsync() метод выглядит следующим образом:

protected virtual Task<TUser> InstantiateNewUserFromExternalProviderAsync(
    string provider,
    string providerId,
    IEnumerable<Claim> claims)
{
    var user = new TUser() { UserName = Guid.NewGuid().ToString("N") };
    return Task.FromResult(user);
}

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

protected override Task<TUser> InstantiateNewUserFromExternalProviderAsync(
    string provider,
    string providerId,
    IEnumerable<Claim> claims)
{
    var user = new TUser
    {
        UserName = Guid.NewGuid().ToString("N"),
        Claims = claims
    };
    return Task.FromResult(user);
}

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


это опция для вас, чтобы передать & resource=https://graph.windows.net в запросе входа в конечную точку авторизации запросите API Azure AD Graph для адреса электронной почты пользователя Office 365, прошедшего проверку подлинности? Например, GET https://graph.windows.net/me/mail?api-version=1.5

дополнительные сведения см. В примере кода WebApp-WebAPI-MultiTenant-OpenIdConnect-DotNet на Github AzureADSamples.


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

для личных счетов, адрес электронной почты возвращается в email поле, как и следовало ожидать.

для учетных записей компании адрес электронной почты возвращается в