Rails 检测会话是否由 SSO/SAML 创建
Rails detect if session was created by SSO/SAML
对于我在 Rails 项目上的 Ruby,我有模型 Account
和模型 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 是来自 Onelogin
的 SLO link
我的项目的另一个方面是,其帐户确实使用 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
我不想在我的用户 table 中创建一个列来记录他们是通过 SAML/SSO 登录还是只是在他们每次登录时设计。换句话说,所以没有迁移。
谢谢!
我看到的两个潜在选项是在身份验证时,您在会话中设置一些指示身份验证类型的内容。您可以从中驱动身份验证行为。
或者您可能会向 IdP 发送 isPassive=true 的 SAML 请求,如果用户与 IdP 的会话有效,这将 return 发送 SAML 响应。然后,您可以根据该响应驱动您的注销行为。
对于我在 Rails 项目上的 Ruby,我有模型 Account
和模型 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 是来自 Onelogin
的 SLO link我的项目的另一个方面是,其帐户确实使用 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
我不想在我的用户 table 中创建一个列来记录他们是通过 SAML/SSO 登录还是只是在他们每次登录时设计。换句话说,所以没有迁移。
谢谢!
我看到的两个潜在选项是在身份验证时,您在会话中设置一些指示身份验证类型的内容。您可以从中驱动身份验证行为。
或者您可能会向 IdP 发送 isPassive=true 的 SAML 请求,如果用户与 IdP 的会话有效,这将 return 发送 SAML 响应。然后,您可以根据该响应驱动您的注销行为。