Внешняя аутентификация не перенаправляется на внешний сайт
Есть странная вещь, происходящая здесь.
Я создал веб-сайт 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/