从 ASP.NET MVC 5 中的 Facebook v2.4 API 访问 OAuth ExternalLoginCallback 中的电子邮件地址 [重复]

Posted

技术标签:

【中文标题】从 ASP.NET MVC 5 中的 Facebook v2.4 API 访问 OAuth ExternalLoginCallback 中的电子邮件地址 [重复]【英文标题】:Access email address in the OAuth ExternalLoginCallback from Facebook v2.4 API in ASP.NET MVC 5 [duplicate] 【发布时间】:2015-10-21 06:19:18 【问题描述】:

使用 v2.3 的 Facebook API,如果设置了以下内容,用户的电子邮件地址将在回调时返回到 ExternalLoginCallback

app.UseFacebookAuthentication(new FacebookAuthenticationOptions

    AppId = "XXX",
    AppSecret = "XXX",
    Scope =  "email" 
);

但是,任何只能针对 v2.4(7 月 8 日发布)的应用程序不再将电子邮件地址返回到 ExternalLoginCallback

我认为这可能与here 列出的 v2.4 更改有关;

声明性字段

为了尝试提高移动网络的性能, v2.4 中的节点和边缘要求您明确请求 GET 请求所需的字段。比如GET /v2.4/me/feed默认不再包含likes和cmets,而是 GET /v2.4/me/feed?fields=comments,likes 将返回数据。更多 有关如何请求特定字段的详细信息,请参阅文档。

我现在如何访问此电子邮件地址?

【问题讨论】:

【参考方案1】:

为了解决这个问题,我必须从 nuget 安装 Facebook SDK for .NET 并单独查询电子邮件地址。

ExternalLoginCallback 方法中,我添加了一个条件来填充来自 Facebook Graph API 的电子邮件地址;

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

if (loginInfo == null)

    return RedirectToAction("Login");


// added the following lines
if (loginInfo.Login.LoginProvider == "Facebook")

    var identity = AuthenticationManager.GetExternalIdentity(DefaultAuthenticationTypes.ExternalCookie);
    var access_token = identity.FindFirstValue("FacebookAccessToken");
    var fb = new FacebookClient(access_token);
    dynamic myInfo = fb.Get("/me?fields=email"); // specify the email field
    loginInfo.Email = myInfo.email;

为了得到FacebookAccessToken,我扩展了ConfigureAuth

app.UseFacebookAuthentication(new FacebookAuthenticationOptions

    AppId = "XXX",
    AppSecret = "XXX",
    Scope =  "email" ,
    Provider = new FacebookAuthenticationProvider
    
        OnAuthenticated = context =>
        
            context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken));
            return Task.FromResult(true);
        
    
);

【讨论】:

嗨,您使用的那个 Facebook 库 nuget 的名称是什么?我愿意知道。谢谢。 太棒了!有效。现在我正在尝试获取其他值 user_birthday - 知道该怎么做吗? @Yovav 查看the api。它说您必须列出您想要返回的所有字段,所以我想如果您将请求更改为/me?fields=email,birthday,您会在回复中收到电子邮件和生日。 谢谢@StaffordWilliams。我在网上搜索找到这个! 我可以确认这在 2017 年仍然有效,因为我是今年第一个发表评论的人 :))) 也使用所有(几乎)最新的东西 - 与 2015 社区相比,Asp.Net 4.6.1 【参考方案2】:

在 MVC 6 (Asp.net Core 1.0) 中,通过在 startup.cs 中配置 FacebookAuthentication,如下所示:

         app.UseFacebookAuthentication(options =>
            
                options.AppId = Configuration["Authentication:Facebook:AppId"];
                options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
                options.Scope.Add("email");
                options.UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email,first_name,last_name";
            );

我可以收到电子邮件。即:

   var info = await _signInManager.GetExternalLoginInfoAsync();
   var email = info.ExternalPrincipal.FindFirstValue(ClaimTypes.Email);

【讨论】:

你的例子是asp.net-mvc-6。此外,我发现对于asp.net-mvc-6,我不必将email 添加到范围内,默认情况下它是可用的。 对此我很抱歉。 ASP.NET 5/Core 1 和 MVC 6 仍然让我一团糟。 实际上我发现这个解决方案也适用于 MVC 5 - 特别是添加上面的 UserInformationEndpoint 是让电子邮件被填充的关键 我正在使用 mvc5,我想在 fb auth 之后获取用户名。你能给我一些方向吗?谢谢 这适用于 Asp 2.2 吗?

以上是关于从 ASP.NET MVC 5 中的 Facebook v2.4 API 访问 OAuth ExternalLoginCallback 中的电子邮件地址 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 ASP.NET MVC 5 中的 Facebook v2.4 API 访问 OAuth ExternalLoginCallback 中的电子邮件地址 [重复]

如何在 asp.net mvc 5 中返回模型和参数中的另一个动作?

VS 2015 ASP.NET 4 MVC 5 中的打字稿 - 设置和选择的工作组合是啥?

将 ASP.NET MVC 从 4 升级到 5 的奇怪错误

使用 C# 从 ASP.Net MVC 中的视频文件中获取视频元数据的最佳方法是啥?

ASP.Net MVC 5 和 SQL 事务隔离级别