Rails检测会话是否由SSO / SAML创建

时间:2019-03-07 21:04:25

标签: ruby-on-rails devise single-sign-on saml onelogin

对于我的Ruby on Rails项目,我有模型Account和模型UserUser属于account,而account有许多users

对于某些帐户,我想让用户使用常规的Devise路线(即由控制器设计/会话控制的路线)。对于其他帐户,我想让用户使用SAML / SSO进行登录。

我已经使用宝石Devisedevise_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是Onelogin的SLO链接

我项目的另一个方面是,其帐户确实使用SAML / SSO的用户也可以使用常规的devise登录路径进行登录。因此,选择使用SSO还是设计路由进行登录都是他们的选择。

如果他们使用设计路线登录,我希望他们通过destroy_user_session_path退出。如果他们使用SSO登录,我希望他们通过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 个答案:

答案 0 :(得分:1)

我看到的两个潜在选项是在身份验证时,您在会话中设置了一些指示身份验证类型的内容。您可以由此驱动身份验证行为。

或者有可能您可以将isPassive = true的SAML请求发送到IdP,如果用户与IdP有有效的会话,则它将返回SAML响应。然后,您可以根据该响应来驱动注销行为。