【问题标题】:OAuth authentication through Owin Facebook stopped working since yesterday从昨天开始,通过 Owin Facebook 的 OAuth 身份验证停止工作
【发布时间】:2017-08-23 23:58:41
【问题描述】:

这段代码运行了一年左右,这个问题与 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 error=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)

【问题讨论】:

    标签: facebook facebook-graph-api oauth


    【解决方案1】:

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

    所以,新的 Owin RC1 更新正在运行。另外,就我而言,无需在 facebookAuthOptions.Fields 中指定任何内容,也无需使用提供者等更改任何其他内容(请参阅https://github.com/aspnet/AspNetKatana/issues/38

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

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

    我认为 facebook 对 Require App Secret 选项做了一些事情并破坏了它,或者新的 Owin RC1 更新没有通过 FacebookAuthenticationOptions 中的 SendAppSecretProof = true

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

    这是当前有效的 Facebook 设置:

    产品:Facebook 登录:

    客户端 OAuth 登录:否

    Web OAuth 登录:是

    嵌入式浏览器 OAuth 登录:否

    强制 Web OAuth 重新认证:否

    从设备登录:否

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

    取消授权回调 URL:https://localhost:44300/signout

    设置:高级:

    需要应用密码:否

    允许 API 访问应用设置:是

    需要 2 因素重新授权:否

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-28
      • 2011-09-17
      • 2018-06-04
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      相关资源
      最近更新 更多