“Name of app” currently has access to Graph API v2.2 which will reach the end of its
2-year lifetime on 27 march,2017. To ensure a smooth transition,
please migrate all calls to Graph API v2.3 or higher.To check if your app will be affected by this upgrade you can use the
Version Upgrade Tool. This will show you which calls,if any,are
affected by this change as well as any replacement calls in newer
versions. If you do not see any calls,your app may not be affected by
this change.You can also use our changelog to see the full list of changes in all
Graph API versions.
我们正在使用ASP.NET MVC 5,我们正在使用或认证如下:
var facebookAuthenticationoptions = new FacebookAuthenticationoptions() { AppId = "****",AppSecret = "****",AuthenticationType = "Facebook",SignInAsAuthenticationType = "ExternalCookie",Provider = new FacebookAuthenticationProvider { OnAuthenticated = async ctx => ctx.Identity.AddClaim(new Claim(ClaimTypes.Email,ctx.User["email"].ToString())) } }; facebookAuthenticationoptions.Scope.Add("email");
但今天,我们的登录信息对象在ExternalLoginCallback中为null:
[HttpGet] [AllowAnonymous] [RequireHttps] public async Task<ActionResult> ExternalLoginCallback(string returnUrl = null) { try { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return RedirectToAction("Login"); } ... more code here...
在Facebook开发. Portal我们的API版本是2.3
我们测试了很多选项,没有结果:
Access email address in the OAuth ExternalLoginCallback from Facebook v2.4 API in ASP.NET MVC 5
Why new fb api 2.4 returns null email on MVC 5 with Identity and oauth 2?
非常感谢你的帮助.
解决方法
>按照NuGet Pacakges进行更新
> Microsoft.Owin到3.1.0-rc1版
> Microsoft.Owin.Security到3.1.0-rc1版
> Microsoft.Owin.Security.Cookies到版本3.1.0-rc1
> Microsoft.Owin.Security.OAuth到版本3.1.0-rc1
> Microsoft.Owin.Security.Facebook到3.1.0-rc1版
var facebookOptions = new FacebookAuthenticationoptions() { AppId = "your app id",AppSecret = "your app secret",BackchannelHttpHandler = new FacebookBackChannelHandler(),UserinformationEndpoint = "https://graph.facebook.com/v2.8/me?fields=id,name,email,first_name,last_name",Scope = { "email" } }; app.UseFacebookAuthentication(facebookOptions);
这是FacebookBackChannelHandler()的定义类:
using System; using System.Net.Http; 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); } }