Ссылка MVC5 Null с входом в facebook
Я получаю исключение нулевой ссылки иногда, когда я вхожу в систему с помощью facebook с помощью контроллера учетных записей ASP.NET mvc5.
Вот метод вымирания:
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
// Crashes on this line
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
if (loginInfo == null)
{
return RedirectToAction("Login");
}
}
Я не уверен, как отладить это. Точка прерывания и замалчивание, хотя код не помогает... В итоге я просматриваю страницу Error.cshtml. Ошибка в этой точке - это простое исключение нулевой ссылки на объект, а внутреннее исключение также равно null.
Edit
Я обновил последние версии Owins через Nuget, без изменений.
Изменить 2
Посмотрев в скрипачье, Facebook возвращает 200 с тем, что выглядит как правильный профиль как json.
Изменить 3
Так странно. Im тестирование с 3 счетами facebook. Два аккаунта работают нормально, 1 нет. Ошибка с возвратом с 200. Я удалил ссылки на приложения в facebook. Я получаю окно подтверждения приложения, я нажимаю ok, и он умирает... так странно.
Ответы
Ответ 1
Быстрое решение.
Вы должны очистить сеанс перед ExternalLoginCallback. Пример.
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider, string returnUrl)
{
ControllerContext.HttpContext.Session.RemoveAll();
// Request a redirect to the external login provider
return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
}
Ответ 2
Обновление моих компонентов Owin с версии 3.0.1 до версии 3.1.0 исправило это (до сих пор). 3.1.0 был выпущен 10 апреля 2017 года.
Ответ 3
Очистка сеанса в соответствии с ответом Ли (отмеченная как ответ) разрешила эту проблему и для нас. У нас есть довольно стандартное веб-приложение ASP.NET MVC 4 с поддержкой Google и Facebook, также включенное на сайтах Azure, и это приводило нас в бешенство.
Он перестанет работать каждые 12-24 часа или где-нибудь в течение этого периода времени, и перезапуск веб-сайта заставит его работать в течение следующего периода, пока это не повторится.
Я действительно удивляюсь, почему очистка сеанса работает... он немного пахнет ошибкой в каркасе (или, может быть, ошибкой Azure в нашем случае), если я не пропущу что-то.
Ответ 4
Моя аналогичная проблема была с Google, я еще не занимался FB. Он работал нормально локально, но удалялся, когда я публиковал на сервере.
В дополнение к тому, что Ли упоминал с добавлением: ControllerContext.HttpContext.Session.RemoveAll();
Я также применил: Лучший способ в asp.net заставить https для всего сайта?
Я также добавил в файл Startup.Auth.cs:
var gProvider = new GoogleAuthenticationProvider { OnAuthenticated = context => Task.FromResult(0) };
var gOptions = new GoogleAuthenticationOptions { Provider = gProvider, SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie, AuthenticationMode = AuthenticationMode.Active };
app.UseGoogleAuthentication(gOptions);
После того, как я развернул свой код, я также перезапустил IIS, пул приложений и веб-сайт. Хотя я понимаю, что перезагрузка IIS после развертывания не идеальна, это был единственный сайт на машине, поэтому мне не пришлось беспокоиться о том, чтобы удалить другой сайт.
Ответ 5
У меня была учетная запись в facebook, у которой не было набора имен пользователей, который давал мне сообщение об исключении из этой строки кода. Кажется, проблема в том, что некоторые свойства ожидаются в учетной записи при возврате информации обратно в ваше приложение, и если эти свойства отсутствуют, он бомбит. В моем случае установка имени пользователя в facebook устранила проблему.
Ответ 6
Ссылка на объект не установлена в экземпляр объекта.
Описание: Необработанное исключение возникло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде.
Сведения об исключении: System.NullReferenceException: ссылка на объект не установлена в экземпляр объекта.
Ошибка источника:
Строка 232: публичная асинхронная задача ExternalLoginCallback (строка returnUrl)
Строка 233: {
Строка 234: var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
Строка 235: if (loginInfo == null)
Строка 236: {
Привет, Раньше у меня такая же ошибка. Я разрешаю его через
Инструменты- > Диспетчер пакетов библиотек- > Управление пакетами Nuget для решений → Microsoft.owin.security.Facebook
Просто добавьте этот референт, теперь вы не получите никакой ошибки