MVC OWIN Security Facebook - невозможно получить адрес электронной почты аутентифицированного пользователя

Я использую OWIN для аутентификации пользователей на веб-сайте MVC. Логин работает, но мне не удалось получить адрес электронной почты пользователя. Я получаю только два значения: имя пользователя и идентификатор.

Как задокументировано и примеры, я пытался использовать этот код в Startup.Auth.cs:

var opt = new FacebookAuthenticationOptions
{
    AppId = "...",
    AppSecret = "...",
};
opt.Scope.Add("email");
app.UseFacebookAuthentication(opt);

Я также пытался указать метод OnAuthenticated в качестве параметра, и если я его отлаживаю, единственными свойствами, полученными из идентификатора facebook, являются имя пользователя и идентификатор, как указано ранее. Других данных нет:

const string XmlSchemaString = "http://www.w3.org/2001/XMLSchema#string";
var opt = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions()
{
    AppId = "...",
    AppSecret = "...",
    SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie,
    Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider()
    {
        OnAuthenticated = (context) =>
        {
            // context.User only have two keys: name and id, email is not there...

            context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, XmlSchemaString, "Facebook"));
            foreach (var x in context.User)
            {
                var claimType = string.Format("urn:facebook:{0}", x.Key);
                string claimValue = x.Value.ToString();
                if (!context.Identity.HasClaim(claimType, claimValue))
                    context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, XmlSchemaString, "Facebook"));

            }
            return Task.FromResult(0);
        }
    }
};
opt.Scope.Add("email");
app.UseFacebookAuthentication(opt);

Пытался войти с 3-х разных аккаунтов в фейсбуке, результат тот же.

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

ОБНОВЛЕНИЕ:
Как указал CBroe, эта проблема может быть связана с изменением в последней версии API 2.4
Я ищу ответ, который использует Microsoft.Owin.Security .Facebook с текущей последней версией API facebook, где я мог успешно получить адрес электронной почты аутентифицированного пользователя и сделать его доступным в утверждениях идентификации контекста.


person zed    schedule 27.07.2015    source источник
comment
@CBroe, как это дубликат ваша ссылка, когда этот пользователь SO пытается получить фотографии через javascript api, а я пытаюсь получить электронную почту пользователя через промежуточное ПО C# owin?   -  person zed    schedule 28.07.2015
comment
Причина проблемы, скорее всего, та же самая — API версии 2.4 ограничил количество полей, которые возвращаются по умолчанию, и любые дополнительные поля, которые вы хотите, теперь должны запрашиваться отдельно. Если используемый вами фреймворк не предоставляет фактический запрос API, который был сделан вам, вам придется попросить создателей этого фреймворка соответствующим образом адаптировать свой код.   -  person CBroe    schedule 28.07.2015
comment
Так что ответ на этот вопрос должен заключаться в том, что owin устарел или глючит, вы это имеете в виду? Добавление областей больше не поддерживается? Я должен решить эту проблему, отправляя запросы к facebook api вне промежуточного программного обеспечения owin?   -  person zed    schedule 28.07.2015
comment
Речь идет не о области разрешений, а о запросе, который извлекает фактические данные из Facebook. В версиях API до v2.4 простой запрос, такой как /me, дал бы вам всю информацию о профиле пользователя, к которой имеет доступ ваше приложение, тогда как теперь он возвращает только идентификатор и имя по умолчанию (как журнал изменений, связанный с ответом на другой вопрос объясняет) — если вам нужны дополнительные поля, теперь вам нужно их запросить, /me?fields=email,…   -  person CBroe    schedule 28.07.2015
comment
Посмотрите на ответ Исаака: stackoverflow.com/a/43834093/1373313   -  person JSWilson    schedule 26.07.2017