Свойства аутентификации.RedirectUri не передается Google в Challenge()
В моем веб-приложении Я зарегистрировал Google в качестве поставщика единого входа:
app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions {
ClientId = "8765.......apps.googleusercontent.com",
ClientSecret = "Secret"
})
Мое приложение не позволяет пользователям регистрироваться (вместо этого их учетные записи создаются администратором, но позже они могут связать свою учетную запись с Google).
В моем контроллере" вход с Google " я пытаюсь выдать Challenge()
для перенаправления в Google. Это может быть неправильный подход:
string redirectUri = "http://localhost:55262/SSO/Google/ProcessToken"; // actually created in code, but shown as string for clarity
AuthenticationProperties properties = new AuthenticationProperties();
properties.RedirectUri = Server.UrlEncode(redirectUri);
Context.GetOwinContext().Authentication.Challenge(properties, "Google");
Это правильно отправляет пользователя в Google, но Google затем представляет ошибка: redirect_uri_mismatch , говоря, что:
URI перенаправления в запросе: http://localhost:55262/signin-google не соответствует зарегистрированному URI перенаправления.
Я уже видел эту ошибку раньше, когда возвращаемая коллекция URI в Панели Управления Google не содержит указанного redirect_uri
.
Если я отлаживаю в VS2015, я вижу, что СВОЙСТВО redirect_uri
установлено правильно в AuthenticationProperties
, но кажется, что OWIN/Katana не передает его Гугл. Вместо этого, когда я нажимаю Google, return_uri-это тот, который по умолчанию используется OWIN / Katana. Тот, который я установил, игнорируется.
Подробности запроса Google, похоже, подтверждают это:
scope=openid profile email
response_type=code
redirect_uri=http://localhost:55262/signin-google
Что я здесь делаю не так, пожалуйста? Разве я не должен использовать Challenge()
, чтобы пользователи могли связать свою учетную запись локального приложения с Google?
2 ответа:
Обратите внимание , что открытая аутентификация OWIN имеет предопределенные методы. Другими словами, в
localhost:port/signin-google
OWIN ожидает вызоваsignin-google внешним сервисом аутентификации (хотя вы не можете найти его реализацию внутри проекта). signin-google является допустимым и рабочим путем, и я настоятельно призываю вас не изменять его (чтобы избежать написания новой реализации в качестве действия контроллера).У меня была похожая проблема, проведя много времени утомительные дни, наконец, я узнал, что проблема исходит от исходного URL пользователя, который действует на отправленный
redirect_uri
OWIN. Ясно:
- Если вы набираете www.site.com →
redirect_uri
равноwww.site.com/signin-google
- Если вы набираете site.com →
redirect_uri
равноsite.com/signin-google
И Google вернется
redirect_uri_mismatch
Ошибка для одного из вышеперечисленных случаев, основанная на введенных URL-адресах перенаправления в консоли. Я думаю, что ваша проблема тоже исходит из этой реальности, и решение-это установка любого возможные URL-адреса в консоли.
Предоставить дополнительную информацию о принятом ответе...
Его можно игнорировать
/signin-google
Оказывается, что
/signin-google
URI управляется изнутри OWIN/Katana. Вам, как разработчику, не нужно беспокоиться об этом, но вам нужно добавить его в консоль разработчика Google в качествеавторизованного URI перенаправления .В запросе Google обратите внимание, что OWIN всегда передает URI перенаправления в Google как
/signin-google
, независимо от того, какой пользователь URI задается в свойствеAuthenticationProperties.RedirectUri
. Хотя на первый взгляд это может показаться ошибкой/проблемой, у него есть большое преимущество в том, что OWIN может управлять всеми обратными вызовами через один URI обратного вызова. Ваш callback URI также не забыт (см. ниже)!.Так что насчет вашего собственного URL-адреса перенаправления?
Ну, вот где
AuthenticationProperties()
вступают в игру. Указав свой собственный URL обратного вызова, как это...AuthenticationProperties properties = new AuthenticationProperties { RedirectUri = "https://my.app.com/custom/callback/uri" };
...после того, как Оуин изучил маркер Google и извлек необходимые детали, затем пользователь перенаправляется на указанный вами URL-адрес.
Вот тут-то я и запутался, так как не понимал, что делать с/signin-google
, когда на самом деле никаких действий не предпринималось. Это относится как к MVC, так и к webforms - вам не нужно беспокоиться о том, что передается в Google. Однако при использовании веб-форм или указании правил авторизации в web.config, вам это понадобится, чтобы предотвратить повторное попадание пользователей на страницу журнала:<location path="signin-google"> <system.web> <authorization> <allow users="*"/> </authorization> </system.web> </location>
Вот весь код вам нужно отправить пользователя в Google и вернуть токен, содержащий их данные:
Исходящий
Отправить пользователя в Google с контроллера, событие нажатия кнопки, загрузка страницы, что угодно (независимо от вашего ASP / хостинга стека):
// set the callback, for after OWIN finishes examining what comes back from Google AuthenticationProperties properties = new AuthenticationProperties { RedirectUri = "https://www.myapp.com/some/callback/uri" }; // send the user to Google Context.GetOwinContext().Authentication.Challenge(properties, "Google"); // Stop execution of the current page/method - the 401 forces OWIN to kick-in and do its thing Response.StatusCode = 401; Response.End();
Входящий
Пользователь возвращается из Google после проверки своей личности
Microsoft.AspNet.Identity.Owin.ExternalLoginInfo loginInfo = Context.GetOwinContext().Authentication.GetExternalLoginInfo();