删除权限时,WebAPI Facebook登录返回“拒绝访问”



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

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

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

    [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()上返回,错误为"访问被拒绝"。

我相信(但不确定)这是因为我的WebAPI试图用全套权限登录他们,但Facebook拒绝了,他们只列出了一个权限,所以返回"拒绝访问"。我的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,但任何对他们不允许的权限的调用都会失败,但这并没有发生。我只是在登录时看到"拒绝访问"

任何帮助都将是惊人的,因为我完全被困在这里!

找到了…

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

该方法失败,因为context.email为null;

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

最新更新