【问题标题】:Web API facebook, email claim returns nullWeb API facebook,电子邮件声明返回 null
【发布时间】:2016-10-21 09:37:12
【问题描述】:

代码如下

启动验证:

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

在 accountcontroler RegisterExternal 类中,我调用以下内容:

var info = await AuthenticationManager_GetExternalLoginInfoAsync_WithExternalBearer();

这个类是什么:

private async Task<ExternalLoginInfo> AuthenticationManager_GetExternalLoginInfoAsync_WithExternalBearer()
    {
        ExternalLoginInfo loginInfo = null;

        var result = await Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalBearer);

        if (result != null && result.Identity != null)
        {
            var idClaim = result.Identity.FindFirst(ClaimTypes.NameIdentifier);
            if (idClaim != null)
            {
                loginInfo = new ExternalLoginInfo()
                {
                    DefaultUserName = result.Identity.Name == null ? "" : result.Identity.Name.Replace(" ", ""),
                    Login = new UserLoginInfo(idClaim.Issuer, idClaim.Value),
                };

            }
        }
        return loginInfo;
    }

这是因为 RegisterExternal 类默认使用身份验证类型 cookie。每当我使用它时,它都会返回 null,所以在网上冲浪后,我注意到有必要添加此代码,这反过来将使用承载进行身份验证,这将导致用户名和身份不再为 null 的回复,因此授权。 (见下图)

Return object (username and login)

但是,当我想认领电子邮件时,我不能这样做。无论我做什么,它都会返回 null 。

【问题讨论】:

  • Facebook 不必履行电子邮件声明。你确定总是这样吗?你可以用其他 FB 帐户检查吗?
  • 我已经确认 facebook 确实在根据其请求请求电子邮件,如果我查看该请求,我会看到 facebook 正在发送我的电子邮件。 (每当您按下“使用 facebook 登录”按钮时,facebook 会弹出一个屏幕,显示“该应用程序将收到以下内容”。它确实会询问我的电子邮件,如果我编辑数据,我会看到我的电子邮件显示,所以工作正常)
  • 你有没有解决过这个@MichaelTralala?目前遇到同样的事情
  • @Braydie 我没有解决这个问题。我认为最好不要使用webapi内置功能并下载和配置facebook api手册。
  • 我忘了我问了!我想我可能有一些工作 - 现在会发布它

标签: c# facebook-graph-api asp.net-web-api registration claims-based-identity


【解决方案1】:

我遇到了同样的问题,并通过使用 Facebook nuget 包获取额外字段来解决它。

在我的应用程序中,我实现了FacebookAuthenticationProvider 并使用以下内容覆盖了Authenticated(...) 方法:

public class FacebookAuthProvider : FacebookAuthenticationProvider
{
    public override Task Authenticated(FacebookAuthenticatedContext context)
    {
        var accessTokenClaim = new Claim("ExternalAccessToken", context.AccessToken, "urn:facebook:access_token");
        context.Identity.AddClaim(accessTokenClaim);
        var extraClaims = GetAdditionalFacebookClaims(accessTokenClaim);
        context.Identity.AddClaim(new Claim(ClaimTypes.Email, extraClaims.First(k => k.Key == "email").Value.ToString()));
        context.Identity.AddClaim(new Claim("Provider", context.Identity.AuthenticationType));
        context.Identity.AddClaim(new Claim(ClaimTypes.Name, context.Identity.FindFirstValue(ClaimTypes.Name)));

        var userDetail = context.User;
        var link = userDetail.Value<string>("link") ?? string.Empty;
        context.Identity.AddClaim(new Claim("link", link));
        context.Identity.AddClaim(new Claim("FacebookId", userDetail.Value<string>("id")));
        return System.Threading.Tasks.Task.FromResult(0);
    }

    private static JsonObject GetAdditionalFacebookClaims(Claim accessToken)
    {
        var fb = new FacebookClient(accessToken.Value);
        return fb.Get("me", new { fields = new[] { "email", "first_name", "last_name" } }) as JsonObject;
    }
}

我的Startup.csConfiguration(IAppBuilder app) 中有这个:

FacebookAuthOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions
{
      AppId = "YOUR APP ID",
      AppSecret = "YOUR APP SECRET",
      Microsoft.Owin.PathString("/Account/ExternalCallBack"), // whatever your external callback url is
      Provider = new FacebookAuthProvider()
};
FacebookAuthOptions.Scope.Add("email");
app.UseFacebookAuthentication(FacebookAuthOptions);

我不知道为什么一开始没有填充电子邮件,但这种方法对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多