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

Ruby on rails 4 我可以让IdP使用omniauth saml将参数转发回我的服务提供商吗?,ruby-on-rails-4,omniauth,saml,Ruby On Rails 4,Omniauth,Saml,我已经在Rails 4.2.0应用程序中使用omniauth SAML成功地设置了SAML身份验证。由于它是一个多租户应用程序,每个租户都可以定义自己的IdP,这很困难,但我做到了 当IdP对用户进行身份验证后,IdP会将它们发送回我的应用程序,地址为/auth/saml/callback,这是omniauth的标准位置。只要我同意将用户发送到我的应用程序中的指定页面(比如,仪表板),这一切都很好 但是,如果用户试图访问特定页面并被发送到登录页面,该怎么办?如果用户正常登录(电子邮件/密码),r

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

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

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


对于omniauth saml,我不知道如何做到这一点。我的第一反应是向IdP发送一个
return\u url
参数,以便IdP可以在身份验证时将其发送回去。有什么方法可以做到这一点吗?

当我输入问题时,我想到了使用会话存储返回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\u url]
时才应设置会话值很重要-我发现
sso\u setup
被调用了三次。第三次,
return\u url
未设置

当IdP调用我的SP时,我只需获取
sessions[:sso\u return\u url]
的值。如果设置了,我知道将用户重定向到哪里