通过Owin Facebook的OAuth身份验证从昨天开始停止工作

时间:2017-03-30 07:39:02

标签: facebook facebook-graph-api oauth

此代码工作正常一年左右,此问题与Facebook将其API响应更改为JSON(而非常规查询字符串)有关

这是一个MVC5项目,我更新为https://www.nuget.org/packages/Microsoft.Owin.Security.Facebook/3.1.0-rc1 如下所示: ASP.NET MVC5 OWIN Facebook authentication suddenly not working并尝试按照此处的建议简化我的通话:https://github.com/aspnet/AspNetKatana/issues/38

此外,我尝试添加BackchannelHttpHandler类(但删除它,因为它不适合我),另外,我删除了我的Facebook网络应用程序(它是API 2.4)并创建了一个未批准的新的(2.8)但是,我认为测试应用程序应该可以正常工作。

我一直收到302错误= access_denied

这是我使用的代码:

var facebookAuthOptions = new FacebookAuthenticationOptions();
facebookAuthOptions.AppId = "xxx";
facebookAuthOptions.AppSecret = "yyy";
facebookAuthOptions.SendAppSecretProof = true;
facebookAuthOptions.CallbackPath = new PathString("/signin-facebook");

facebookAuthOptions.Scope.Add("public_profile");
facebookAuthOptions.Scope.Add("email");
facebookAuthOptions.Scope.Add("user_birthday");

// added for Microsoft.Owin.Security.Facebook/3.1.0-rc1
facebookAuthOptions.Fields.Add("email");
facebookAuthOptions.Fields.Add("birthday");
facebookAuthOptions.Fields.Add("gender");
facebookAuthOptions.Fields.Add("locale");
facebookAuthOptions.Fields.Add("location");
facebookAuthOptions.Fields.Add("timezone");

facebookAuthOptions.Provider = new FacebookAuthenticationProvider()
{
    OnAuthenticated = (context) =>
    {
        context.Identity.AddClaim(new Claim("FacebookAccessToken", context.AccessToken));

        var expiryDuration = context.ExpiresIn ?? new TimeSpan();
        context.Identity.AddClaim(new Claim("urn:facebook:expires_in", DateTime.UtcNow.Add(expiryDuration).ToString(CultureInfo.InvariantCulture)));

    // Add all other available claims
    foreach (var claim in context.User)
    {
        var claimType = string.Format("urn:facebook:{0}", claim.Key);
        var claimValue = claim.Value.ToString();
        if (!context.Identity.HasClaim(claimType, claimValue))
            context.Identity.AddClaim(new Claim(claimType, claimValue, "XmlSchemaString", "Facebook"));
    }

    return Task.FromResult(0);
}
};
app.UseFacebookAuthentication(facebookAuthOptions);

净流量看起来像这样:

  

https://localhost:44300/external-providers   (302)

     

https://www.facebook.com/v2.8/dialog/oauth?response_type=code&client_id=1897713540512505&redirect_uri=https%3A%2F%2Flocalhost%3A44300%2Fsignin-facebook&scope=&state=OXOiCtOJPEK5WCQkEJt-mH3lxEnTCXG3YcGFtW7j_dyuPd_9LevphavHobpB6EH3Wfb8BpbhqST13SacFMB3OnddsgnslzcAX7KnMpzpnEcfFI3KErmByenV9xn1IEt7PhY4TjXi5KHFNUp1PVu_ikUBnvf0hJpY2IK0fczvQLVmGKplJV-g6qsEMYXfKHNYoqjDiu9cA-iGIPXfRxPxZg   (302)

     

https://localhost:44300/signin-facebook?code=AQDrGJ9sqk0ENVw_7RW3zmauzV1Gf6rWXBotgAKf6uBbdryamL5RMHiOgIrBiPYdy8CA9HC9hq2sahu2bt-VwznOJ8PNFTxRmLCe0PRrwxSsffscHSdNzjz16jjavuupse087mB_2KhZeKKWeS2Rlwabcfa-n4FGIcyDizpOKTWJl_J6PFAjWv3XfPy1zkbLz0cAsTdQ8t8pOARPhP5nKwUIGN5GuS4fzuGhgPCerlPyHknK0BWcFrRC0fa_n3X2d0-zANu6nzhRspssDTWmIAr9PZCLOlpSMlJeb1NrebECNbw4YqGzScCWxBRVL8YAfQ4&state=OXOiCtOJPEK5WCQkEJt-mH3lxEnTCXG3YcGFtW7j_dyuPd_9LevphavHobpB6EH3Wfb8BpbhqST13SacFMB3OnddsgnslzcAX7KnMpzpnEcfFI3KErmByenV9xn1IEt7PhY4TjXi5KHFNUp1PVu_ikUBnvf0hJpY2IK0fczvQLVmGKplJV-g6qsEMYXfKHNYoqjDiu9cA-iGIPXfRxPxZg   (302)

     

https://localhost:44300/signup-connect?error=access_denied   (302)

     

https://localhost:44300/signout   (200)

1 个答案:

答案 0 :(得分:1)

好的,我终于找到了问题,这花了我3天,绝对是2017年最烦人的错误。

所以,新的Owin RC1更新正在运行。另外,在我的情况下,不需要在facebookAuthOptions.Fields中指定任何内容,也不需要更改提供者等的任何其他内容(参见https://github.com/aspnet/AspNetKatana/issues/38

我曾经(现在仍然如此)的问题是,Facebook页面设置:高级:需要应用机密 - 总是设置为YES,现在,作为Facebook更改后的大规模混乱的一部分API,我还删除了我的Facebook应用程序并使用最新的2.8 API创建了一个新应用程序。

我的代码中也有这个:facebookAuthOptions.SendAppSecretProof = true; 这应该是有效的,但是现在我将Require App Secret设置为NO。

我认为facebook在他们的需求App Secret选项上做了一些事情并且打破了它,或者新的Owin RC1更新没有在FacebookAuthenticationOptions中传递SendAppSecretProof = true

无论如何,这是一个艰难的,希望有人在花了整整3-4天之前找到它。

这是当前有效的Facebook设置:

  

产品:Facebook登录:

     

客户端OAuth登录:否

     

Web OAuth登录:是

     

嵌入式浏览器OAuth登录:否

     

强制Web OAuth重新认证:否

     

从设备登录:否

     

有效的OAuth重定向URI:https://localhost:44300/signin-facebook

     

取消对回拨网址的授权:https://localhost:44300/signout

     

设置:高级:

     

要求App Secret:否

     

允许API访问应用程序设置:是

     

需要双因素重新授权:否

更新:appsecret_proof未正确传递给查询字符串,这将很快修复到新的Owin版本中,可以将Require App Secret设置回YES。