Свойства аутентификации.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 2

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();