Внешняя аутентификация не перенаправляется на внешний сайт

Есть странная вещь, происходящая здесь.

Я создал веб-сайт ASP.NET MVC5 и поддерживаю локальные учетные записи с помощью идентификатора ASP.NET.

Теперь я пытаюсь включить внешнюю аутентификацию, но имеет некоторые странности.

Я уверен, что следил за правильными шагами. У меня это в моем Startup.Auth.cs:

    public void ConfigureAuth(IAppBuilder app)
    {
        // Enable the application to use a cookie to store information for the signed in user
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });
        // Use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // Uncomment the following lines to enable logging in with third party login providers
        //app.UseMicrosoftAccountAuthentication(
        //    clientId: "",
        //    clientSecret: "");

        //app.UseTwitterAuthentication(
        //   consumerKey: "",
        //   consumerSecret: "");

        //app.UseFacebookAuthentication(
        //   appId: "",
        //   appSecret: "");

        app.UseGoogleAuthentication();
    }

Когда пользователь нажимает на ссылку для входа в Google, вызывается метод ExternalLogin:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult ExternalLogin(string provider, string returnUrl)
    {
        // Request a redirect to the external login provider
        return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
    }

который я проверил посредством отладки, попадает в метод ExecuteResult класса ChallengeResult:

        public override void ExecuteResult(ControllerContext context)
        {
            var properties = new AuthenticationProperties() { RedirectUri = RedirectUri };
            if (UserId != null)
            {
                properties.Dictionary[XsrfKey] = UserId;
            }
            context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider);
        }

Однако в браузере ничего не происходит. Я просто получаю пустую страницу, где я ожидаю перенаправления на страницу входа в Google.

Об ошибках не сообщается вообще.

Другим смешным было то, что я попытался создать другое приложение MVC5, но я получаю всплывающее сообщение "Object reference not set to object of object" в VS2013, а в результирующем проекте отсутствует контроллер учетной записи, который обычно существует по умолчанию.

Я отремонтировал установку VS2013, я повторно установил Update 1, и я также обновил все пакеты Nuget в решении.

У меня закончились идеи о том, куда идти дальше.

Обновление 1 Подумав, что это может быть связано с моим ПК, я развернул сайт для Azure, и проблема все еще сохраняется. Означает ли это, что это может быть связано с отсутствующей сборкой, и она не сообщается правильно? Я запустил fusionlog, но не вижу никаких сбоев связи.

Скручивание новой виртуальной машины с чистой установкой Windows 8 и VS2013, чтобы увидеть, могу ли я получить там новый проект.

Обновление 2 Хорошо, просто запустил еще один раунд "сетевого" захвата, и когда пользователь выбирает внешнего провайдера, он отправляет сообщение в действие ExternalLogin, но ответ является неавторизованным. Что может быть причиной этого?

Ответ 1

Хорошо,

Я понял, что (важная часть) проблемы.

Во-первых, я до сих пор не знаю, почему, когда я создаю проект MVC, я не получаю класс AccountController для scaffold.

Однако, похоже, моя проблема в том, что моя кнопка входа в систему была передана "google" вместо "Google".

Серьезно!? Я немного удивлен, что корпус будет иметь значение с именем поставщика, но там вы идете.

Ответ 2

Это не ответ на ваш вопрос, но он отвечает на очень похожую проблему.

Если у вас Owin 2.0 и вы переходите на 2.1

_ExternalLoginsListPartial необходимо изменить из этого:

<button type="submit" class="btn btn-default" id="@p.AuthenticationType" name="Partner" value="@p.AuthenticationType" title="Log in using your @p.Caption account">@p.AuthenticationType</button>

к этому

<button type="submit" class="btn btn-default" id="@p.AuthenticationType" name="provider" value="@p.AuthenticationType" title="Log in using your @p.Caption account">@p.AuthenticationType</button>

Единственное, что меняется, это имя кнопки, но это может сломать вам голову, как у меня, и стоило мне 2 дня работы, чтобы найти проблему.

Возможно, это объясняется в новой версии Owin, если это не должно указываться в капиталах.

Ответ 3

Я столкнулся с той же проблемой с моим ASP.Net WebAPI-сервером. Я передавал правильный метод AuthenticationType в метод вызова, но все равно получаю пустую страницу.

Оказывается, проблема заключалась в том, что я добавил поставщиков OAuth в конвейер OWIN при запуске. Примерно мой рабочий заказ:

        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
        OAuthBearerOptions = new OAuthBearerAuthenticationOptions();

        var authServerOptions = new OAuthAuthorizationServerOptions
        {
        ...
        };

        // Token Generation
        app.UseOAuthAuthorizationServer(authServerOptions);
        app.UseOAuthBearerAuthentication(OAuthBearerOptions);

        // Configure Google External Login
        GoogleAuthOptions = new GoogleOAuth2AuthenticationOptions()
        {
            ClientId = xxxx,
            ClientSecret = xxxx,
            Provider = new GoogleAuthProvider()
        };
        app.UseGoogleAuthentication(GoogleAuthOptions);

        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        app.UseWebApi(config);

Раньше я добавлял методы UseCors + UseWebApi перед использованием метода UseGoogleAuthentication.

Я нашел этот пост полезным: http://coding.abel.nu/2014/06/understanding-the-owin-external-authentication-pipeline/