我可以让IdP使用omniauth-saml将参数转发回我的服务提供商吗?

时间:2015-03-19 21:39:41

标签: ruby-on-rails-4 omniauth saml

我已经在我的Rails 4.2.0应用程序中使用omniauth-saml成功设置了SAML身份验证。由于它是一个多租户应用程序,每个租户都可以定义自己的IdP,这很难,但我做到了。

当IdP对用户进行身份验证后,IdP会将其发送回/auth/saml/callback我的应用,这是omniauth的标准位置。只要我将用户发送到我的应用程序中的指定页面(例如,仪表板),这一切都很顺利。

但是如果用户试图访问特定页面并被发送到登录页面怎么办?如果用户要正常登录(电子邮件/密码),rails应用程序会记住返回的网址,并将用户放回原来他们想去的地方。

使用omniauth-saml,我不知道该怎么做。我的第一直觉是向IdP发送return_url参数,以便IdP可以在身份验证时将其发回。有没有办法可以做到这一点?

1 个答案:

答案 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]的值。如果已设置,我知道在哪里重定向用户。