Обновление 2017!
Проблема, с которой я столкнулась, когда я разместил оригинальный вопрос, не имеет ничего общего с недавними изменениями, сделанными Facebook, когда они заставили всех до версии 2.3 их API. Для решения этой конкретной проблемы см. ответы sammy34 ниже. Версия 2.3 конечной точки /oauth/access _token теперь возвращает JSON вместо форматированных значений
По историческим причинам, здесь мой оригинальный вопрос/вопрос:
У меня есть веб-приложение MVC5, которое использует встроенную поддержку аутентификации через 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 явно что-то не так.