当前位置: 动力学知识库 > 问答 > 编程问答 >

asp.net mvc - ExternalLoginInfo Email is always null in Microsoft and Facebook oauth2, MVC C#?

问题描述:

I'm using the following code for ExternalLoginCallback

In google everything is OK. but in Facebook and Microsoft loginInfo.Email is always null.

What's wrong with the following code?

 [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

});

}

I'm using the following packages:

<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" />

网友答案:

I found the solution, We have to use Facebook and Microsoft as the following in Startup.Auth.cs file:

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

// Microsoft
app.UseMicrosoftAccountAuthentication(new MicrosoftAccountAuthenticationOptions()
{
    ClientId = "---",
    ClientSecret = "---",
    Scope = { "wl.basic", "wl.emails" }
});
网友答案:
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" }
            });

Create a class :

 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);
        }
    }

works for me.

分享给朋友:
您可能感兴趣的文章:
随机阅读: