WebAPI Facebook 登录在删除权限时返回访问被拒绝

WebAPI Facebook login returning Access Denied when removing permissions

我有一个用于 iOS 和 WP 的客户端应用程序(用 Xamarin 编写),它使用 WebAPI 和 Facebook 作为登录的唯一方法。我的问题是当用户自定义所需的权限并删除其中一些,WebAPI 只是从 OWIN 或 Facebook(在我的代码外部)接收 "access_denied"。

该应用程序也被添加到他们的 Facebook 帐户中,并带有他们选择的受限权限子集,这意味着在随后的每次登录中,他们也会获得 "access denied"。另外,因为他们没有成功注册 WebAPI,所以我没有 Facebook 的用户访问令牌,因此我可以从他们的 Facebook 帐户中删除该应用程序(重新开始)。解决此问题的唯一方法是手动访问 facebook 并从您的应用设置页面中删除该应用,然后重试。

我完全卡住了。登录时,他们在 WebAPI 中输入以下方法并在 ChallengeResult();

上到达 return
    [Route("ExternalLogin", Name = "ExternalLogin")]
    public async Task<IHttpActionResult> GetExternalLogin(string provider, string error = null)
    {
        if (error != null)
        {
            return Redirect(Url.Content("~/") + "#error=" + Uri.EscapeDataString(error));
        }

        if (!User.Identity.IsAuthenticated)
        {
            return new ChallengeResult(provider, this);
        }

从这里开始,它与 Facebook 通信(验证),随后在 Redirect() 上调用此方法 returns,错误为 "access denied"。

我相信(但不确定)发生这种情况是因为我的 WebAPI 正在尝试使用全套权限让他们登录,但 Facebook 说不,他们只列出了一个权限,所以"access denied" 是 returned。我的 Startup.auth.cs 文件如下所示;

        var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions
        {
            AppId = Constants.AppId,
            AppSecret = Constants.AppSecret,
            Provider = new FacebookAuthenticationProvider()
            {
                OnAuthenticated = (context) =>
                {
                    context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, ClaimValueTypes.String, "Facebook"));
                    context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:email", context.Email, ClaimValueTypes.Email, "Facebook"));
                    return Task.FromResult(0);
                }
            },
        };
        facebookOptions.Scope.Add("email");
        facebookOptions.Scope.Add("user_friends");
        app.UseFacebookAuthentication(facebookOptions);

当用户在首次登录时删除了一些默认权限时,我应该如何处理这种情况?我希望他们可以成功注册到我的 WebAPI,但是随后对他们不允许的权限的任何调用都会失败,但这并没有发生。我只是在登录时看到 "access denied"。

任何帮助都会很棒,因为我完全被困在这里了!

找到了...

在 Startup.auth.cs 的 OnAuthenticated 方法中,您可以访问 USER 访问令牌。在这里,您可以检查通过使用令牌访问图表 api 授予的 facebook 权限,并在需要时删除该应用程序。

方法失败,因为 context.email 为空;

context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:email", context.Email, ClaimValueTypes.Email, "Facebook"));