Могу ли я сделать так, чтобы IdP перенаправлял параметр обратно моему поставщику услуг с помощью omniauth-saml?

Я успешно настроил аутентификацию SAML с помощью omniauth-saml в своем приложении Rails 4.2.0. Поскольку это мультитенантное приложение, и каждый арендатор может определить своего собственного поставщика удостоверений, это было непросто, но я справился.

Когда IdP аутентифицирует пользователя, IdP отправляет его обратно в мое приложение по адресу /auth/saml/callback, стандартному месту для omniauth. Пока я могу отправить пользователя на указанную страницу в моем приложении (скажем, на панель инструментов), все это работает хорошо.

Но что, если пользователь пытался получить доступ к определенной странице и был отправлен на страницу входа? Если пользователь должен был войти в систему обычным образом (электронная почта/пароль), приложение rails запоминает обратный URL-адрес и отправляет пользователя туда, куда он пытался перейти в первую очередь.

С omniauth-saml я не уверен, как это сделать. Мой первый инстинкт — отправить параметр return_url IdP, чтобы IdP мог отправить его обратно после аутентификации. Есть ли способ сделать это?


person Aaron    schedule 19.03.2015    source источник


Ответы (1)


Пока я печатал свой вопрос, мне пришла в голову идея использовать сеанс для хранения возвращаемого 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]. Если он установлен, я знаю, куда перенаправить пользователя.

person Aaron    schedule 19.03.2015