Rails определяет, был ли сеанс создан с помощью единого входа / SAML

#ruby-on-rails #devise #single-sign-on #saml #onelogin

#ruby-on-rails #разработка #единый вход #saml #onelogin

Вопрос:

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

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

Я успешно реализовал это с помощью gems 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, также могут входить в систему, используя обычные маршруты входа devise. Так что это их выбор — использовать либо единый вход, либо разработать маршруты для входа.

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

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

 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
  

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

Спасибо!

Комментарии:

1. Просто мысль, но можете ли вы вставить что-нибудь в session ?

Ответ №1:

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

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