更新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-和-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实现显然存在问题。