Я использую 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, где я мог успешно получить адрес электронной почты аутентифицированного пользователя и сделать его доступным в утверждениях идентификации контекста.
/me
, дал бы вам всю информацию о профиле пользователя, к которой имеет доступ ваше приложение, тогда как теперь он возвращает только идентификатор и имя по умолчанию (как журнал изменений, связанный с ответом на другой вопрос объясняет) — если вам нужны дополнительные поля, теперь вам нужно их запросить,/me?fields=email,…
- person CBroe   schedule 28.07.2015