SAML-аутентификация с использованием angular, node.js и поставщика удостоверений

Я хочу реализовать систему единого входа с использованием SAML2. Но я не знаю, как заставить его работать с распределенной системой, где каждый экземпляр работает независимо на своем собственном сервере. Среда состоит из трех экземпляров:

  • Пример №1: угловой интерфейс
  • Экземпляр №2: серверная часть node.js (с использованием express.js + паспорт)
  • Экземпляр № 3: экземпляр SAML (поставщик удостоверений)

Вопрос в том, что было бы лучшим подходом, если внешний интерфейс вызывает защищенный внутренний маршрут? Какую последовательность действий можно считать хорошей практикой?

На данный момент у меня в голове такое поведение:

  1. Внешний интерфейс отправляет запрос на защищенный внутренний маршрут
  2. Поскольку пользователь не прошел проверку подлинности, сервер инициирует перенаправление на SSO-страницу, предоставленную поставщиком удостоверений.
  3. Там учетные данные вводятся
  4. Пользователь аутентифицируется экземпляром saml и отправляет запрос обратно на сервер.
  5. Теперь пользователь аутентифицирован, сервер отправляет клиенту ответ с запрошенным ресурсом.

Но пока я думаю об этой последовательности, я понимаю, что это не сработает. Это потому, что внешний интерфейс является собственным экземпляром и не зависит от внутреннего. Перенаправление на SSO-страницу, инициированное паспортом, не работает, если у вас есть отдельный экземпляр внешнего интерфейса. Это работает, если вы вызываете защищенный маршрут напрямую из браузера, потому что тогда у вас есть только два партнера по связи (поставщик услуг и поставщик удостоверений) вместо трех. Но это не тот случай.

Спасибо и привет

Филипп

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
6 833
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я сделал что-то подобное в предыдущей работе с этой логикой:

  1. Реализуйте страницу входа в Angular (простая форма для получения учетных данных), затем вызовите службу входа в систему в бэкэнде.
  2. Эта внутренняя служба входа в систему должна проверять учетные данные, предоставленные внешним интерфейсом, против поставщика удостоверений (я уверен, что они предоставят вам URL-адрес, по которому вы можете ввести эти параметры).
  3. После проверки личности вызовите службу аутентификации в бэкенде, чтобы сгенерировать токен для этого пользователя (работу должен выполнить Passport JS), а затем отправьте этот токен обратно во внешний интерфейс.
  4. Во внешнем интерфейсе внедрите защиту, которая должна обрабатывать токены/устанавливать учетные данные пользователя в локальное хранилище...
  5. Во внешнем интерфейсе также реализуйте перехватчик, который внедряет этот токен в каждый заголовок XHR или перенаправляет пользователя на форму входа в случае, если токен отсутствует или просрочен.
  6. В бэкэнде логика будет классической (проверьте действительность токена из заголовка XHR перед отправкой обратно данных/укажите интерфейсу войти в систему, если проверка не удалась).

С помощью этой логики вы будете отделять внешний интерфейс от поставщика удостоверений и согласовывать его с внутренним.

Большое спасибо. Это звучит здорово. Я дам ему попробовать. Я подумал о другом возможном решении: если пользователь не аутентифицирован, серверная часть отправляет ошибку во внешний интерфейс. Инициируется перенаправление на страницу SSO-Login (window.location.href). Для этого требуется, чтобы интерфейс знал IDP. После того, как пользователь ввел учетные данные и прошел проверку подлинности IDP, он отправляет запрос на маршрут обратного вызова... Я опубликую это решение, если оно сработает.

mayerph 11.12.2020 16:31

@mayerph Ваше решение сработало? Или вы выбрали другой путь.

Janna 25.10.2021 13:42

Пункт 1 и 2 однозначно нет. Пользователь должен быть перенаправлен на страницу входа в систему поставщика удостоверений для ввода учетных данных.

Ricardo Seromenho 06.12.2022 01:20

Основная концепция SSO-аутентификации заключается в том, что учетные данные не передаются из внешнего интерфейса по соображениям безопасности.

sql_dummy 18.01.2023 02:28

Другие вопросы по теме