Получение адреса электронной почты пользователя из Azure AD через OpenID Connect
Я пытаюсь аутентифицировать пользователей на моем сайте с их учетными записями Office 365, поэтому я следовал инструкциям по использованию промежуточного программного обеспечения OWIN OpenID Connect для добавления аутентификации и успешно сумел аутентифицировать и получить их профиль.
теперь я пытаюсь получить адрес электронной почты пользователя (чтобы я мог заполнить их системную учетную запись своими контактными данными), но я не могу получить заявку по электронной почте. Я попытался сделать запрос, используя область openid profile email
, но набор утверждений не содержит никакой почтовой информации.
есть ли способ получить электронную почту пользователя из Azure AD через конечную точку OpenID Connect?
3 ответов
я боролся с той же проблемой в течение нескольких дней прежде, чем прибыть в решение. В ответ на ваш вопрос: Да, вы должны иметь возможность получить адрес электронной почты обратно в своих претензиях, пока вы:
- включить
profile
илиemail
область в вашем запросе и - настройте приложение в разделе Azure Portal Active Directory для включения Войдите и прочитайте Профиль пользователя под делегирован Разрешения.
обратите внимание, что адрес электронной почты не может быть возвращен в email
claim: в моем случае (как только я получил его работу) он возвращается в name
претензии.
однако, не получив адрес электронной почты обратно на всех может быть вызвано одним из следующих вопросов:
нет адреса электронной почты, связанного с учетной записью Azure AD
согласно этому руководству к области, разрешения и согласие в Azure Active Directory v2.0 конечная точка, даже если email
область вы не можете получить адрес электронной почты обратно:
на
если вы получаете другие, связанные с профилем претензии обратно (как given_name
и family_name
), это может быть проблема.
претензии, отброшенные middleware
это было причиной для меня. Я не получал любой претензии, связанные с профилем (имя, фамилия, имя пользователя, электронная почта и т. д.).
в моем случае стек обработки идентификаторов выглядит так это:
- IdentityServer3
- IdentityServer3.AspNetIdentity
- пользовательский поставщик хранения Couchbase на основе couchbase-aspnet-identity
проблема была в 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
поле, как и следовало ожидать.
для учетных записей компании адрес электронной почты возвращается в