2015-04-26 9 views
13

Korzystam z następującego kodu dla ExternalLoginCallback
W google wszystko jest w porządku. ale w Facebook i MicrosoftloginInfo.Email jest zawsze pusta. Co jest nie tak z następującym kodem?Email ExternalLoginInfo zawsze ma wartość zerową w Microsoft i Facebook oauth2, MVC C#?

[AllowAnonymous] 
public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
{ 
    ExternalLoginInfo loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 
    if (loginInfo == null) 
    { 
     return RedirectToAction("Login"); 
    } 

    // loginInfo.Email is always null, so FindByEmailAsync throws an exception 
    UserIdentityModel user = await UserManager.FindByEmailAsync(loginInfo.Email); 

    if (user != null) 
    { 
     await SignInAsync(user, false); 
     return RedirectToLocal(returnUrl); 
    } 

    // If the user does not have an account, then prompt the user to create an account 
    ViewBag.ReturnUrl = returnUrl; 
    ViewBag.LoginProvider = loginInfo.Login.LoginProvider; 
    return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel 
    { 
     UserName = loginInfo.DefaultUserName, 
     Email = loginInfo.Email 
    }); 
} 

Używam następujące pakiety:

<package id="Microsoft.Owin" version="3.0.1" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security" version="3.0.1" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.Cookies" version="3.0.1" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.Facebook" version="3.0.1" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.Google" version="3.0.1" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.MicrosoftAccount" version="3.0.1" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.OAuth" version="3.0.1" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security.Twitter" version="3.0.1" targetFramework="net45" /> 
+0

Nie korzystałem jeszcze z Microsoft oAuth, ale w przypadku Facebooka musisz konkretnie poprosić o uprawnienia do wiadomości e-mail w konfiguracji aplikacji na Facebooku, w przeciwnym razie nie otrzymasz adresu e-mail. – Stephen

+0

Zrobiłem to, a ja sprawdziłem pocztę. –

Odpowiedz

22

znalazłem rozwiązanie, musimy użyć Facebook i Microsoft jako następujące w Startup.Auth.cs pliku:

// Facebook 
app.UseFacebookAuthentication(new FacebookAuthenticationOptions 
{ 
    AppId = "---", 
    AppSecret = "---", 
    Scope = { "email" } 
}); 

// Microsoft 
app.UseMicrosoftAccountAuthentication(new MicrosoftAccountAuthenticationOptions() 
{ 
    ClientId = "---", 
    ClientSecret = "---", 
    Scope = { "wl.basic", "wl.emails" } 
}); 
+0

Mam do czynienia z tym samym problemem uwierzytelniania Yahoo OAuth2. E-mail jest pusty po udanym uwierzytelnieniu. Czy masz rozwiązanie do uwierzytelniania Yahoo? –

+0

Mam ten sam problem: http://stackoverflow.com/questions/29998559/value-cannot-be-null-parameter-name-email-at-externallogincallback –

+8

Po wykonaniu tej czynności nadal "info.Email" ma wartość null dla mnie. –

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

Utwórz klasę:

public class FacebookBackChannelHandler : HttpClientHandler 
    { 
     protected override async System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) 
     { 
      // Replace the RequestUri so it's not malformed 
      if (!request.RequestUri.AbsolutePath.Contains("/oauth")) 
      { 
       request.RequestUri = new Uri(request.RequestUri.AbsoluteUri.Replace("?access_token", "&access_token")); 
      } 

      return await base.SendAsync(request, cancellationToken); 
     } 
    } 

działa dla mnie.

+0

Yeap, które działało. –

+0

działa również dla mnie - thanx – yarg

0

Próbowałem odpowiedzi Mahometa. Nie ma kości. Próbowałem odpowiedzi Bimal. Nie ma kości.

W końcu zaktualizowałem wszystkie moje referencje OWIN przy użyciu Nuget. Teraz działa.

Jeśli inne odpowiedzi nie działają, spróbuj zaktualizować wszystkie pakiety Nuget z uwzględnieniem wszystkich elementów OWIN.

Powiązane problemy