我已经在我的Rails 4.2.0应用程序中使用omniauth-saml成功设置了SAML身份验证。由于它是一个多租户应用程序,每个租户都可以定义自己的IdP,这很难,但我做到了。
当IdP对用户进行身份验证后,IdP会将其发送回/auth/saml/callback
我的应用,这是omniauth的标准位置。只要我将用户发送到我的应用程序中的指定页面(例如,仪表板),这一切都很顺利。
但是如果用户试图访问特定页面并被发送到登录页面怎么办?如果用户要正常登录(电子邮件/密码),rails应用程序会记住返回的网址,并将用户放回原来他们想去的地方。
使用omniauth-saml,我不知道该怎么做。我的第一直觉是向IdP发送return_url
参数,以便IdP可以在身份验证时将其发回。有没有办法可以做到这一点?
答案 0 :(得分:2)
当我输入我的问题时,我想出了使用会话来存储返回网址的想法。由于我以前无法找到答案,我想在此分享。
我有omniauth使用我的设置阶段,如下所示:
# config/initializers/omniauth.rb
provider :saml, setup: true
我的会话控制器会照顾它:
# config/routes.rb
get '/auth/:provider/setup' => 'sessions#sso_setup'
# controllers/sessions_controller.rb
def sso_setup
session[:sso_return_url] = params[:return_url] if params[:return_url]
# setup...
end
如果设置params[:return_url]
,则指定仅设置会话值非常重要 - 我发现sso_setup
被调用三次。第三次,return_url
未设置。
当IdP回复我的SP时,我只获得sessions[:sso_return_url]
的值。如果已设置,我知道在哪里重定向用户。