Я'вэ был создан новый веб-MVC5 приложение, и когда я пытаюсь войти с Google или Facebook, то ExternalLoginCallback действий в AccountController называется, но GetExternalLoginInfoAsync () всегда возвращает null:
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
if (loginInfo == null)
{
return RedirectToAction("Login");
}
Потому что это's всегда равен null, он просто перенаправляет обратно на страницу входа, и процесс начинается снова. Как я могу это исправить?
Чтобы получить OWIN в Google войти на стандартные Visual Studio 2013 с сайта MVC5 ASP.Net мне пришлось:
Настройка учетной записи OpenId Google в https://console.developers.google.com/project
Установить URL-адрес обратного вызова бла/авторизоваться в Google
. <БР/> важные заметки на вещи, которые вы Дон'т нужно сделать:
Вы Don'т должны использовать HTTPS для Google, чтобы перенаправить обратно; вы даже можете перенаправить обратно на равнину http://localhost нет проблем.
Вы Don'т нужно ничего настраивать для перенаправления URL-адреса - нет маршрутов, действий контроллера или специального разрешения в веб.Конфиг. Перенаправление URL-адреса всегда /авторизоваться-Google и долг обрабатывает это за кадром для вас.
В качестве примера, если ваш сайт был me.com вы могли бы эти 3 адреса обратного вызова в консоли разработчика Google:
http://localhost:53859/signin-google
http://test.me.com/signin-google
https://me.com/signin-google
Первая в том, что номер порта против дал вам для вашего проекта.
/счета/ExternalLoginCallback
включает `&ошибка=access_denied, и что's, потому что Гугл сказал, что нет разрешения просить долг сделан для пользователей'ы Гугл+ основной профиль. Я могу'т сказать, чья это вина, Гугл'ы или Microsoft'ов.Для включения в Google+ API в консоли разработчиков, выберите Apis слева, охотиться на Google+, нажмите и нажмите Включить. Да, вы действительно должны сделать это. Вы'вновь в пролете, если вы не'т сделать это.
ВАР Гугл = новый GoogleOAuth2AuthenticationOptions() { Параметр ClientID = "и 123авс.приложений.googleusercontent.ком-то", ClientSecret = назальный 456xyz;, Поставщик = новый GoogleOAuth2AuthenticationProvider() }; Гугл.Область.Добавить("по почте" - а); приложение.UseGoogleAuthentication(Гугл);
Что's оно. Что, наконец, получил это работает.
Просто хочу повторить еще раз, там много ответов по этому поводу и вопросы, как где долг/Гугл разве't работа, и почти все они не правы для нынешнего VS2013/MVC5/OWIN в шаблон.
<БР/> вы не'т необходимости изменить web.Конфиг на все.
<БР/> вы не'т нужно создавать какие-либо специальные маршруты.
<БР/> вы не должны пытаться точке /авторизоваться в Google
в другое место, или использовать другой URL-адрес обратного вызова, и вы наверняка должны'т пытайтесь привязать ее непосредственно к /счета/externallogincallback
или externalloginconfirmation
, потому что они оба отделены от /авторизоваться-Google
и необходимые шаги в долг/Гугл процесс.
ОК, я узнал, почему он's в нуль. Вы должны включить Google + API в консоли Google. Также убедитесь, что секретный ключ не сцепляются с пробелом в конце после того, как вы вставьте его на свой код. Почему может'т они возвращают нормальное ошибку? Я не'т знаю.
Кажется, что NuGet-пакета от Microsoft.Долг.Безопасности.Версия 3.0.1 Facebook больше не работает с логином Facebook.
Пакет обновления до предварительной версии 3.1.0 версия, вы можете использовать следующее:
установка пакета Microsoft.Долг.Безопасности.Facebook -Заранее
Как и другие правильно сказали, большую часть времени, что's, потому что вы не имеете разрешения для Google+ API, так вот как получить разрешение на проект в Google API диспетчера в Google+ по API
Шаг 1. Выберите проект сверху ComboBox и перейдите к приборной панели > Включить API
Шаг 2: Поиск Google Plus и выбрать его
если вы вернетесь в личный кабинет для этого проекта вы можете увидеть список API с поддержкой's для этого проекта внизу
Я получил его на работу, просто обновив весь пакет снежок в приложение и оно работало.
Это решает мою проблему:
Включить в Google+ по API. Это грубо и есть первопричина проблемы в вопрос здесь - Если вы Don'т сделать это, он'ы легко не заметить, что запрос на /счета/ExternalLoginCallback
включает `&ошибка=access_denied, и что's, потому что Гугл сказал, что нет разрешения просить долг сделан для пользователей'ы Гугл+ основной профиль. Я могу'т сказать, чья это вина, Гугл'ы или Microsoft'ов.
Для включения в Google+ API в консоли разработчиков, щелкните API слева, ищет в Google+, нажмите кнопку и нажмите включения.
Я бежал в эту проблему сегодня и оказалось, что я определил дистанционного печенье после того, как я поручил поставщиков.
Убедитесь, что вы делаете...
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
прежде чем...
app.UseFacebookAuthentication(
appId: "",
appSecret: "");
Для тех, кто испытывает эту проблему для веб-API. Других решений не AuthenticationManager помочь.GetExternalLoginInfoAsync();` возвращает всегда null даже плюс Google API-интерфейс включен.
использовать эту пользовательскую функцию, чтобы получить logininfo. очевидно, что Microsoft имеет ошибок для GetExternalLoginInfoAsync при запросе через веб-API.
private async Task<ExternalLoginInfo> AuthenticationManager_GetExternalLoginInfoAsync_WithExternalBearer()
{
ExternalLoginInfo loginInfo = null;
var result = await Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalBearer);
if (result != null && result.Identity != null)
{
var idClaim = result.Identity.FindFirst(ClaimTypes.NameIdentifier);
if (idClaim != null)
{
loginInfo = new ExternalLoginInfo()
{
DefaultUserName = result.Identity.Name == null ? "" : result.Identity.Name.Replace(" ", ""),
Login = new UserLoginInfo(idClaim.Issuer, idClaim.Value)
};
}
}
return loginInfo;
}
Я сделал следующее, чтобы заставить его работать.
Вход на портал разработчика, найдите нужное приложение и делаем следующее.
После долгих поисков и головной боли, а также после многочисленных здесь отвлекающий маневр ответов на StackOverflow я в конце концов прошел все мои варианты на моей консоли разработчика Google и обнаружил маленькую кнопку синий [включить] на Google+API на страницу обзора. Я нажал это, и вуаля, это сработало. Забудьте этот вздор, вы читали о обратного вызова URL-адрес и маршрут конфиги, долг переопределяет по умолчанию Google /авторизоваться-Google перенаправить URI в любом случае и отправляет вас обратно в ExternalLoginCallback. Просто палка с реализацией по умолчанию все будет хорошо так долго, как вы включите ваш Google+по API.
Хотя ответы выше все хорошо, в моем экземпляре ни один из этих работал - я'д проверил и перепроверил Настройки Google и согласен с Крисом Moschini, что там's большое заблуждение информацию.
Для меня это было 'дох момент, когда я понял, что мой выход из процесса Государственная служба не была запущена! Без ошибок (в качестве логина была первая вещь, которую я пытался после перезагрузки, где Государственная служба находится в режиме ручного пуска на машину) просто нуль от GetExternalLoginInfoAsync`
Надеюсь, это поможет кто-то другой.
Я хотел внести свой вклад в это также. Я совсем недавно получил эту работу. У меня была проблема с GetExternalLoginInfoAsync возвращает значение null, а только в производство.
После долгих поисков я, наконец, нашел мой ответ это просто проблемы с моей базы данных. В производстве я поставил не ту строку подключения, поэтому он не будет правильно подключить, но это было в основном молчат об этом. Единственное, что произошло GetExternallLoginInfoAsync возвращает значение null. Так вы проверить строку подключения к базе данных, если это произойдет!
Также отметим, единственная вещь, которая была необходима, чтобы получить эту работу был:
Вам не придется включить https, вам не придется создавать собственные маршруты. Но убедитесь, что ваша база данных работает должным образом!
Для меня был перенос и старая, но работает .Сайт net 4.6.1 MVC в ядро 1.1. Работы прекратились, прежде чем я мог заставить его работать, когда я взял его обратно, тогда я переходила на 2.х.
Моя проблема заключалась в том, что обратного вызова от Google было встречено 404
с моего сайта. Я думала, что это должно ударить AccountController.ExternalLoginCallback поэтому я добавил [маршрут(...)]
и конечно, Google'ы обратного вызова нажмите действие.
После этого нажмите на "нуль" возвращается в этой строке (на какую доходность маньяк с нуля
?)
var externalLoginInfo = await this.SignInManager.GetExternalLoginInfoAsync();
Я обратной инженерии его найти под капотом своего в конечном итоге получить обработчик для ExternalScheme
которые для меня были печеньки обработчик!
Все это казалось неправильным, и я чувствовал, что промежуточное должно было перехватить URI обратного вызова, так что я удалил мой [маршрут(...)]
и проблема 404
вернулся.
Затем я обнаружил, что мне нужно добавить это во время запуска.
applicationBuilder.UseAuthentication();
Это решает 404
, но дает другой вопрос.
свойство authenticationscheme не был указан, и нет DefaultSignInScheme нашли.
Путем добавления схема по умолчанию, устранить вышеуказанные ошибки.
serviceCollection.AddAuthentication(IdentityConstants.ExternalScheme)
.AddGoogle(googleOptions => Configuration.Bind("OAuth2:Providers:Google", googleOptions))
.AddExternalCookie();
Теперь AccountController.ExternalLoginCallbackснова ссылаться на некоторые магии, но я вернулась к
нуль` возвращаемое значение.
Я добавил этот код выше ошибочную строку, которая по сути того, что происходит под капотом (просмотр в Microsoft's код на GitHub). Интересно, что " з " в CookieAuthenticationHandler типа и
и все мои претензии и информацию из Google внутри!
var authHandler = this.HttpContext.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>();
var h = await authHandler.GetHandlerAsync(this.HttpContext, IdentityConstants.ExternalScheme);
var a = await h.AuthenticateAsync();
var externalLoginInfo = await this.SignInManager.GetExternalLoginInfoAsync();
Покопавшись в GitHub и копировать вставить внутренний код работает в моем контроллере, я вижу, что это'ы не в состоянии найти ClaimTypes.NameIdentifier на мои претензии, это
ProviderKey` использовать позже.
Хм....
Обеспокоен я использовал старые 1.код X AccountController с новой 2.X биты тож я нашел некоторые примеры, которые до сих пор используют этот материал, и некоторые образцы, которые используют страницы Razor за все это тоже. Я'будете продолжать то, что у меня есть.
Поэтому я'м рядом будут расследовать сопоставление дополнительных пользователей Гугла в формате JSON элементов полезной нагрузки на претензии. Я думаю, если мой Google идентификатор учетной записи (числовых, я думаю) было сопоставлено, тогда все будет работать.
Окончательное Исправление
Я наконец-то решен вопрос, добавив, что "претензионно-исковом порядке", чтобы вытащить мой идентификатор Google из в JSON возвращается из Google!
serviceCollection.AddAuthentication(IdentityConstants.ExternalScheme)
.AddGoogle(googleOptions =>
{
Configuration.Bind("OAuth2:Providers:Google", googleOptions);
googleOptions.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "sub", "string");
})
.AddExternalCookie();
Поле суб
содержит то, что в конечном итоге заканчивается претендовать на "nameidentifier" и затем в ProviderKey
, что `AccountController хочет.
Это правда, что вы будете нуждаться в Google плюс включен. Главное для меня был URL-адрес проекта. Откройте окно Свойства (вид -> Свойства окна) в ПРОТИВ а затем щелкните правой кнопкой мыши на проекте и выберите Свойства. В окне Свойства, скопировать URL-адрес SSL, а затем в большом окне Свойства выберите вкладку Web и вставить этот URL в поле URL-адрес проекта.
Исправлена проблема для меня.
Ознакомиться более подробно: https://docs.microsoft.com/en-us/aspnet/mvc/overview/security/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on
Все остальные ответы Я'т решить это для меня, так что если вы в одной лодке, затем убедитесь, что регистрационные действия контроллер имеет атрибут параметр имеет:
// GET: /Account/LoginRegister
[AllowAnonymous]
[RequireHttps]
public ActionResult LoginRegister()
{
return View(new RegisterLoginViewModel());
}