【发布时间】:2014-04-17 08:24:22
【问题描述】:
2017 年更新!
我发布原始问题时遇到的问题与 Facebook 最近在强制所有人使用其 API 2.3 版时所做的更改无关。有关该特定问题的解决方案,请参阅 sammy34 的回答如下。 /oauth/access_token 端点的 2.3 版现在返回 JSON 而不是表单编码值
由于历史原因,这是我最初的问题/问题:
我有一个 MVC5 Web 应用程序,它使用内置支持通过 Facebook 和 Google 进行身份验证。当我们几个月前构建这个应用程序时,我们遵循了这个教程:http://www.asp.net/mvc/tutorials/mvc-5/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on,一切都很好。
现在,突然之间,Facebook 身份验证刚刚停止工作。 Google 身份验证仍然很有效。
问题描述:我们单击链接以使用 Facebook 进行连接,我们将被重定向到 Facebook,如果我们不允许 Facebook 应用程序访问我们的个人资料,系统会提示我们。当我们点击“确定”时,我们会被重定向回我们的网站,但我们并没有登录,而是直接进入了登录屏幕。
我已经在调试模式下完成了这个过程,并且按照上面提到的教程在我的帐户控制器中获得了这个 ActionResult:
// GET: /Account/ExternalLoginCallback
[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
if (loginInfo == null)
{
return RedirectToAction("Login");
}
............
当单步执行代码并从 Facebook 返回时,loginInfo 对象始终为 NULL,这会导致用户被重定向回登录。
为了了解幕后实际发生的情况,我安装了 Fiddler 并监控了 HTTP 流量。我发现,在 Facebook 权限对话框中单击“确定”后,Facebook 会使用以下 URL 重定向回我们的应用程序:
https://localhost/signin-facebook?code=<access-token>
这个 URL 不是一个实际的文件,我猜可能是由一些内置在这个 OWIN 框架中的控制器/处理程序处理的。最有可能的是,它使用给定的代码连接回 Facebook,以查询有关尝试登录的用户的信息。现在,问题是我们没有这样做,而是被重定向到:
/Account/ExternalLoginCallback?error=access_denied
我确信这是 Facebook 正在做的事情,也就是说,它不是向我们提供用户数据,而是通过这条错误消息将我们重定向回来。
这会导致 AuthenticationManager.GetExternalLoginInfoAsync(); 失败并始终返回 NULL。
我完全没有想法。据我们所知,我们没有做任何改变。
我尝试创建一个新的 Facebook 应用程序,我尝试再次按照教程进行操作,但我总是遇到同样的问题。
欢迎任何想法!
更新!
好吧,这快把我逼疯了!我现在已经手动完成了执行身份验证所需的步骤,并且当我这样做时一切正常。为什么在使用 MVC5 Owin 的东西时这不起作用?
这就是我所做的:
// Step 1 - Pasted this into a browser, this returns a code
https://www.facebook.com/dialog/oauth?response_type=code&client_id=619359858118523&redirect_uri=https%3A%2F%2Flocalhost%2Fsignin-facebook&scope=&state=u9R1m4iRI6Td4yACEgO99ETQw9NAos06bZWilJxJrXRn1rh4KEQhfuEVAq52UPnUif-lEHgayyWrsrdlW6t3ghLD8iFGX5S2iUBHotyTqCCQ9lx2Nl091pHPIw1N0JV23sc4wYfOs2YU5smyw9MGhcEuinvTAEql2QhBowR62FfU6PY4lA6m8pD3odI5MwBYOMor3eMLu2qnpEk0GekbtTVWgQnKnH6t1UcC6KcNXYY
I was redirected back to localhost (which I had shut down at this point to avoid being redirected immediately away). The URL I was redirected to is this:
https://localhost/signin-facebook?code=<code-received-removed-for-obvious-reasons>
Now, I grabbed the code I got and used it in the URL below:
// Step 2 - opened this URL in a browser, and successfully retrieved an access token
https://graph.facebook.com/oauth/access_token?client_id=619359858118523&redirect_uri=https://localhost/signin-facebook&client_secret=<client-secret>&code=<code-from-step-1>
// Step 3 - Now I'm able to query the facebook graph using the access token from step 2!
https://graph.facebook.com/me?access_token=<access-token-from-step-2>
没有错误,一切正常!那么为什么在使用 MVC5 Owin 的东西时这不起作用呢? OWin 的实现显然有问题。
【问题讨论】:
-
我正在处理同样的问题 - 昨天开始发生。我有一个使用此处描述的过程的 MVC5 应用程序:stackoverflow.com/questions/18942196/… 和此处:stackoverflow.com/questions/20928939/…。在我的本地开发环境中运行良好,在 azure 平台上出现交替错误 access_denied 和 FB 错误“应用程序配置不允许给定 URL。:应用程序的设置不允许一个或多个给定 URL...”
-
好,我不是唯一一个 :-) 如果我找到解决此问题的方法,我一定会通知您!
-
我也遇到了同样的问题,将example.com/signin-facebook 设置为 facebook 上的重定向 url 解决了这个问题
-
按照您的 URL 测试方法,我注意到我的应用程序密码已更改!干杯。
标签: facebook asp.net-mvc-5 owin