Owin Facebook Ошибка входа в систему ТОЛЬКО на производственной площадке MVC Azure - PullRequest
0 голосов
/ 02 марта 2019

Краткая версия:

У меня есть веб-приложение MVC5, развернутое как веб-роль облачной службы Azure.Использование Owin для входа в систему.Интеграция с Owin Facebook работает нормально при тестировании сайта на localhost, но на рабочем сервере GetExternalLoginInfoAsync () возвращает нуль в обратном вызове от signin-facebook.

Некоторые детали:

  • Имеют все последние пакеты Owin Nuget (4.0.1, кроме Identity.Owin 2.2.2 и Owin (компоненты запуска) 1.0).
  • Приложение использует базовую проверку подлинности файлов cookie Owin (традиционные входы в систему работают нормально).
  • Мы не используем Owin SigninManager по умолчанию или UserManager согласно шаблону MVA WebApplication.(Сбой происходит задолго до достижения любого из этого кода, теоретически!)
  • Тестирование с использованием Chrome в Windows 10.
  • Отлично работает на локальном хосте (как отладочном, так и выпускном), непосредственно работая в сети.проект из Visual Studio (без участия облачных сервисов).
  • Я использую одного и того же тестового пользователя Facebook как для localhost, так и для производства.
  • На стороне Facebook все выглядит нормально, и приложение добавляется всписок приложений пользователя со всеми разрешениями.Это не отказ от Facebook.
  • Дошло до того, что удалил Application Insights (поскольку это что-то другое в производстве), но это не повлияло на проблему.

Взгляд на DevToolsв Chrome:

  • Контроль кэша для всех выглядит нормально, все без кэширования.
  • Файл cookie .AspNet.Correlation.Facebook установлен и возвращается (то же значение) вконечная точка входа в Facebook по завершении из Facebook.Обратите внимание, что нет других файлов cookie, связанных с Owin.

Re.Развертывание:

  • Облачная служба Azure состоит из одной веб-роли.
  • Облачная служба Azure osFamily = "5" osVersion = "*"
  • Развертывание выполненонепосредственно из Visual Studio в промежуточный слот (щелкните правой кнопкой мыши публикацию).
  • Обычно я выполняю интерактивный вход в промежуточный слот, а когда все прогревается, я использую портал Azure для замены слотов.Проверка входа в Facebook выполняется только в производственном слоте (не в стадии подготовки).

Вот фрагмент кода, показывающий обработку (ChallengeResult соответствует текущему коду шаблона WebApplication).Контроллер помечен как [OutputCache (Location = OutputCacheLocation.None)] и не помечен для [Авторизовать]:

    // POST: /Membership/ExternalSignupDispatch (They clicked to login with Facebook, Google, etc.)
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult ExternalSignupDispatch(string provider, string community = Communities.Dating)
    {
        // Request a redirect to the external login provider
        return new ChallengeResult(provider, Url.Action("ExternalSignupCallback1", "Membership", new { community }));
    }

    // GET: /Membership/ExternalSignupCallback
    public async Task<ActionResult> ExternalSignupCallback1(string community = Communities.Dating)
    {
        var info = await AuthenticationManager.GetExternalLoginInfoAsync();
        if (info == null) // Unsuccessful login
        {

Беззвучный сбой Owin / Facebook на рабочем сервере сводит с ума.Если бы только была ошибка перечисления ... или исключение ... но увы

Любые идеи очень ценятся!

1 Ответ

0 голосов
/ 05 марта 2019

Итак.Оказывается, что в настоящее время Овин будет работать таинственным образом, если в нем не будет предварительно существующего файла cookie ASP.NET_SessionID.Без этого функция signin-facebook не удаляет cookie-файл .Aspnet.Correlation.Facebook и не устанавливает cookie-файл .Aspnet.ExternalCookie.Отсутствие файла cookie идентификатора сеанса каким-либо образом препятствует выполнению требуемой обработки файла cookie.Все это создает условия для периодических сбоев в режиме без вывода сообщений, в зависимости от состояния файла cookie клиента.

Обходной путь - сохранить поддельную переменную Session при создании формы с помощью входа в Facebook, что вызывает создание файла cookie SessionID перед любымOwin logins.

Обратите внимание, что мы используем SystemWebCookieManager (в надежде избежать таких проблем с cookie).Похоже, что вещи все еще развиваются.

Для справки, вот настройка cookie в нашей функции ConfigureAuth:

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            CookieManager = new SystemWebCookieManager(), 
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            ExpireTimeSpan = TimeSpan.FromMinutes(Params.LoginExpiryMinutes), 
            SlidingExpiration = true,
            LoginPath = new PathString("/Login"),
            Provider = new CookieAuthenticationProvider // Used to allow returning 401 Unauthorized status to API calls, instead of 302 redirect
            {
                OnApplyRedirect = ctx =>
                {
                    if (!IsAjaxRequest(ctx.Request))
                    {
                        ctx.Response.Redirect(ctx.RedirectUri);
                    }
                }
            }
        });

        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
...