Rails определяет, был ли создан сеанс SSO / SAML - PullRequest
1 голос
/ 08 марта 2019

Для моего проекта Ruby on Rails у меня есть модель Account и модель User. User принадлежит account, а account имеет множество users.

Для некоторых учетных записей я хочу разрешить пользователям использовать обычные маршруты Devise (то есть маршруты, контролируемые контроллером devise / session). Для некоторых других учетных записей я хочу разрешить пользователям использовать SAML / SSO для входа в систему.

Я успешно реализовал это, используя гемы Devise и devise_saml_authenticatable. Пользователи в своих учетных записях могут входить с использованием любого маршрута в зависимости от того, используют ли их учетные записи SAML / SSO. Я использую Onelogin в качестве провайдера идентификации.

Однако для выхода из системы. Я хочу, чтобы пользователи, чья учетная запись не использовала SAML / SSO, вышли из системы через

destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy.

С этим я легко могу поставить =link_to 'Logout', destroy_user_session_path, method: :delete

С другой стороны, я хочу, чтобы пользователи, чья учетная запись использовала SAML / SSO, вышли из системы через путь SLO провайдера идентификации. Для одного из таких аккаунтов я пробовал

= link_to "Logout", 'https://mycompany.onelogin.com/trust/saml2/http-redirect/slo/xxxyyy'

https://mycompany.onelogin.com/trust/saml2/http-redirect/slo/xxxyyy - это ссылка SLO от Onelogin

Другим аспектом моего проекта является то, что пользователи, чья учетная запись использует SAML / SSO, также могут входить, используя обычные маршруты входа в систему. Поэтому они выбирают для входа либо единый вход, либо разрабатывают маршруты.

Если они вошли в систему, используя маршруты разработки, я хочу, чтобы они вышли через destroy_user_session_path. Если они вошли в систему с помощью единого входа, я хочу, чтобы они вышли через https://mycompany.onelogin.com/trust/saml2/http-redirect/slo/xxxyyy

Есть ли способ определить, был ли текущий сеанс выполнен с использованием SAML / SSO, чтобы я мог сделать

if signed_in_with_sso
  = link_to 'Log out', https://mycompany.onelogin.com/trust/saml2/http-redirect/slo/xxxyyy
else
  = link_to 'Log out', destroy_user_session_path, method: :delete

Я не хочу создавать столбец в моей таблице пользователей, чтобы записывать, вошли ли они через SAML / SSO или просто разрабатывали каждый раз при входе. Другими словами, никаких миграций.

Спасибо!

1 Ответ

1 голос
/ 13 марта 2019

Два возможных варианта, которые я вижу, либо в точке аутентификации, вы устанавливаете что-то в сеансе, которое указывает тип аутентификации.Вы можете управлять поведением аутентификации из этого.

Или есть вероятность, что вы могли бы отправить запрос SAML с isPassive = true в IdP, который будет возвращать ответ SAML, если у пользователя есть действительный сеанс с IdP.Затем вы можете определить свое поведение при выходе из этого ответа.

...