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

问题描述 投票:1回答:1

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

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

我已经使用gems 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的用户也可以使用常规设计登录路由登录。因此,他们可以选择使用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登录还是只是在他们每次登录时设计。所以没有迁移,换句话说。

谢谢!

ruby-on-rails devise single-sign-on saml onelogin
1个回答
1
投票

我看到的两个可能的选项是在身份验证点,你在会话中设置一些指示身份验证类型的东西。您可以从中驱动身份验证行为。

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

© www.soinside.com 2019 - 2024. All rights reserved.