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

Can I have the IdP forward a parameter back to my service provider with omniauth-saml?

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

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

但是,如果用户试图访问特定页面并被发送到登录页面怎么办?如果用户正常登录 (email/password),rails 应用会记住 return url 并将用户送回他们最初尝试去的地方。

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

当我输入问题时,我想到了使用会话来存储 return url 的想法。由于以前找不到答案,所以在这里分享一下。

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