我正在尝试使用 Microsoft OWIN OAuth 库在现有的 ASP.NET MVC 5 应用程序中实现 Facebook 身份验证,但找不到获取用户电子邮件地址的方法。注册看起来像这样:
var options = new FacebookAuthenticationOptions
{
AppId = "YYY",
AppSecret = "ZZZ"
};
options.Scope.Add("public_profile");
options.Scope.Add("email");
app.UseFacebookAuthentication(options);
范围 email
被添加到选项中。
在身份验证时,在 Controller 的 ExternalLoginCallback
方法中,email
为空,代码如下:
AuthenticateResult authResult = await authenticationManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie);
ClaimsIdentity externalIdentity = authResult.Identity;
string email = externalIdentity.FindFirstValue(ClaimTypes.Email);
也试过了,没用:
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
var email = loginInfo.Email;
从 Facebook 返回的 Json 数据似乎不包含电子邮件地址:
{"id":"989197284440871","first_name":"Martin","gender":"male","last_name":"Stauf\u010d\u00edk","link":"https:\/\/www.facebook.com\/app_scoped_user_id\/989197284440871\/","locale":"cs_CZ","name":"Martin Stauf\u010d\u00edk","timezone":2,"updated_time":"2014-10-18T16:14:08+0000","verified":true}
是 Facebook 没有返回地址的问题还是代码中缺少某些内容?我们将不胜感激。
谢谢。
最佳答案
为了回答我自己的问题,我刚刚升级了应用程序以使用最新的组件 MVC 5.2.3 和 OWIN 3.0.1,现在身份验证工作正常。获取电子邮件地址的代码是:
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
var email = loginInfo.Email;
...
}
这是在 Visual Studio 中创建的新 ASP.NET MVC Web 项目附带的默认代码。不管是什么问题,现在都已解决。
关于oauth-2.0 - Facebook 不返回用户的电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26594181/