Как я могу молча аутентифицировать пользователя на отдельном веб-сайте, когда он уже вошел в систему на центральном сайте OAuth2 / OIDC? - PullRequest
0 голосов
/ 08 декабря 2018
  • Я разработал свое собственное веб-приложение OAuth2 / OIDC, используя IdentityServer4, который работает нормально.Это на https://myauthservice.com

  • У меня есть отдельный веб-сайт, который является зарегистрированным клиентом моей службы IdentityServer4 и расположен по адресу https://mywebsite.com.

  • . Оба веб-сайта созданы с использованием ASP.NET Core 2.1.
  • На / (домашняя страница) https://mywebsite.com не применяются правила авторизации.
    • Однако, если пользователь уже вошел в систему if( this.User.Identity.IsAuthenticated ), он перенаправляется на страницу своей учетной записи (/account), которая имеет правило авторизации, если пользователь не авторизован (например, потому что он 'не прошли проверку подлинности) они перенаправляются на страницу входа https://myauthservice.com's с набором returnURL.
    • На домашней странице также есть ссылка HTML <a href="/account">Login to your account</a>, которая при нажатии приводит к описанному выше процессу входа в систему.

Проблема в том, что если посетитель уже вошел в систему https://myauthservice.com, но еще не посетил https://mywebsite.com, то он перенаправляется наhttps://myauthservice.com's страница входа, которая видит, что они уже аутентифицированы (проверяя файлы cookie myauthservice.com) и перенаправляет их обратно на https://mywebsite.com с правом access_token.

Я хочу исключить этот шаг, чтобы пользователи на https://mywebsite.com не увидели страницу «Вход в свою учетную запись» и не перенесли два перенаправления браузера, если они уже вошли в систему https://myauthservice.com -но https://mywebsite.com не будет иметь access_token пользователя, так чтоe решение?

Я понимаю, что у меня может быть скрытая <iframe> на https://mywebsite.com's домашняя страница /, которая указывает на https://myauthservice.com's страницу входа (с установленным returnURL), которая будетверните access_token правильно, и тогда клиентский скрипт обнаружит его и автоматически перенаправит пользователя на страницу /account, но это также похоже на хак.

Другой вариант - изменить процесс входа в системуна https://myauthservice.com, чтобы включить скрытый реверс <iframe>, который заставляет браузер отправлять access_token на всем веб-сайтам, которым я доверяю (не только * 1071)* чтобы получить правильные куки заранее, поэтому, когда они в конечном итоге посетят https://mywebsite.com, они уже будут иметь аутентичные куки и будут перенаправлены на /account при первом запросе.

Какое руководство отдля этого сценария существует команда IdentityServer4 или сообщество OAuth2 / OIDC?

Обновление: теперь я понимаю, что в основном спрашиваю, как реализовать настоящий единый вход с помощью IdentityServer4.StackExchange решил эту проблему еще в 2010 году: https://stackoverflow.blog/2010/09/11/global-network-auto-login/ - мне нужно посмотреть, как они это сделали.

1 Ответ

0 голосов
/ 08 декабря 2018

Предполагая, что вы хотите придерживаться стандартного OpenID Connect, вы можете использовать запрос без авторизации, который сообщит вам, аутентифицированы ли они уже или нет.Это может работать на стороне клиента (iframe) или перенаправлении на стороне сервера (пользовательский интерфейс не отображается, поэтому пользователь не будет осведомлен).Если вы получите код ошибки login_required, о котором вы знаете, что затем начнете поток регулярного входа, в противном случае вы получите идентификатор и маркер доступа и сможете выполнить локальный вход в систему в обычном режиме.

На практике это работает хорошо и совсем не является взломом, поскольку этот подход является частью спецификации управления сеансами OIDC.

...