0

код выглядит следующим образомWeb API facebook, электронная почта требование возвращает нуль

запуска AUTH:

 app.UseFacebookAuthentication(new FacebookAuthenticationOptions 
     { 
      AppId = "xxx", 
      AppSecret = "xxx", 
      BackchannelHttpHandler = new FacebookBackChannelHandler(), 
      UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email,first_name,last_name,location", 
      Scope = { "email" } 
     }); 

в accountcontroler RegisterExternal классе я называю следующее:

вар Информация = ждут AuthenticationManager_GetExternalLoginInfoAsync_WithExternalBearer() ;

Что этот класс:

private async Task<ExternalLoginInfo> AuthenticationManager_GetExternalLoginInfoAsync_WithExternalBearer() 
    { 
     ExternalLoginInfo loginInfo = null; 

     var result = await Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalBearer); 

     if (result != null && result.Identity != null) 
     { 
      var idClaim = result.Identity.FindFirst(ClaimTypes.NameIdentifier); 
      if (idClaim != null) 
      { 
       loginInfo = new ExternalLoginInfo() 
       { 
        DefaultUserName = result.Identity.Name == null ? "" : result.Identity.Name.Replace(" ", ""), 
        Login = new UserLoginInfo(idClaim.Issuer, idClaim.Value), 
       }; 

      } 
     } 
     return loginInfo; 
    } 

Это происходит потому, что RegisterExternal класс по умолчанию будет использовать аутентификации типа куки. Всякий раз, когда я его использую, он возвращает null, поэтому после серфинга в Интернете я заметил, что необходимо добавить этот код, который, в свою очередь, будет использовать носитель для аутентификации, это приведет к ответу, в котором имя пользователя и идентификатор больше не равны нулю , таким образом санкционированный. (См рисунок ниже)

Return object (username and login)

Но, когда я хочу, чтобы претендовать на электронную почту, я не могу это сделать. Он всегда будет возвращать null независимо от того, что я делаю.

+0

Facebook не обязан выполнять требования по электронной почте. Вы уверены, что это всегда так? Можете ли вы проверить с другими учетными записями FB? – RVid

+0

Я проверил, что facebook действительно запрашивает электронное письмо по его запросу, и если я посмотрю на этот запрос, я вижу, что facebook отправляет мне письмо. (всякий раз, когда вы нажимаете кнопку «login with facebook», facebook выводит экран с «приложение получит следующее». Там он запрашивает мой адрес электронной почты, и если я редактирую данные, я вижу, что отображается мой адрес электронной почты, так что это нормально работает) –

+0

Вы когда-нибудь решали этот @MichaelTralala? Запуск в то же самое на данный момент – Braydie

ответ

1

Я столкнулся с той же проблемой и решил ее с помощью пакета nuget Facebook, чтобы получить дополнительные поля.

В моем приложении я реализовал FacebookAuthenticationProvider и переопределить метод Authenticated(...) со следующим:

public class FacebookAuthProvider : FacebookAuthenticationProvider 
{ 
    public override Task Authenticated(FacebookAuthenticatedContext context) 
    { 
     var accessTokenClaim = new Claim("ExternalAccessToken", context.AccessToken, "urn:facebook:access_token"); 
     context.Identity.AddClaim(accessTokenClaim); 
     var extraClaims = GetAdditionalFacebookClaims(accessTokenClaim); 
     context.Identity.AddClaim(new Claim(ClaimTypes.Email, extraClaims.First(k => k.Key == "email").Value.ToString())); 
     context.Identity.AddClaim(new Claim("Provider", context.Identity.AuthenticationType)); 
     context.Identity.AddClaim(new Claim(ClaimTypes.Name, context.Identity.FindFirstValue(ClaimTypes.Name))); 

     var userDetail = context.User; 
     var link = userDetail.Value<string>("link") ?? string.Empty; 
     context.Identity.AddClaim(new Claim("link", link)); 
     context.Identity.AddClaim(new Claim("FacebookId", userDetail.Value<string>("id"))); 
     return System.Threading.Tasks.Task.FromResult(0); 
    } 

    private static JsonObject GetAdditionalFacebookClaims(Claim accessToken) 
    { 
     var fb = new FacebookClient(accessToken.Value); 
     return fb.Get("me", new { fields = new[] { "email", "first_name", "last_name" } }) as JsonObject; 
    } 
} 

Мой Startup.cs имеет это в Configuration(IAppBuilder app):

FacebookAuthOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions 
{ 
     AppId = "YOUR APP ID", 
     AppSecret = "YOUR APP SECRET", 
     Microsoft.Owin.PathString("/Account/ExternalCallBack"), // whatever your external callback url is 
     Provider = new FacebookAuthProvider() 
}; 
FacebookAuthOptions.Scope.Add("email"); 
app.UseFacebookAuthentication(FacebookAuthOptions); 

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

+0

Отлично, я буду тестировать его как можно скорее, спасибо! –

Смежные вопросы