【问题标题】:Setting up SAML callback in Rails using Devise and OmniAuth-SAML使用 Devise 和 OmniAuth-SAML 在 Rails 中设置 SAML 回调
【发布时间】:2017-09-25 21:54:52
【问题描述】:

编辑:底部附近的附加信息和简明问题;)

我正在使用 SAML2.0 在我正在制作的一个小应用程序和一个身份提供者之间设置集成。

一般来说,我一直遵循设计页面上的说明,然后是 Omniauth-SAML 文档。

目前的问题似乎是没有生成回调路径。这是下面的相关代码位;随时索取更多信息。

app/models/user.rb

class User < ActiveRecord::Base
  devise :omniauthable, omniauth_providers: [:saml]

  def from_omniauth(auth_hash)
    puts auth_hash
    new  # Stub for now I guess?
  end
end

app/controllers/omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def saml
    @user = User.from_omniauth request.env['omniauth.auth']
    if @user.persisted?
      sign_in_and_redirect @user, event: :authentication
      set_flash_message(:notice, :success, kind: 'SAML') if is_navicational_format?
    else
      session['devise.saml_data'] = request.env['omniauth.auth']
      redirect_to permission_denied # this isn't going to work lol
    end
  end

  def failure
    redirect_to root_path
  end
end

来自 config/initializers/devise.rb 的截断和清理的块

  config.omniauth :saml,
                  idp_cert_fingerprint: 'aa:bb:cc...', # an actual fingerprint here 
                  idp_sso_target_url: 'https://sso.bla.thing.com/fss/idp/startSSO.ping?PartnerSpId=SAML_UID',
                  issuer: 'myidpname',  # Not actually sure what this should be
                  idp_entity_id: 'thingfssdp',
                  assertion_consumer_service_url: 'https://myapp.com/auth/saml/callback',
                  name_identifier_format: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress'

根据文档herehere,添加超过上述内容(即,将附加要求放入 config/initializers/omniauth.rb)是不正确的。

我的控制器将before_action :authenticate_user! 作为第一行。

config/routes.rb 在顶部有以下行:

Rails.application.routes.draw do
  devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }

但可能需要注意的是,我还没有手动添加任何回调处理逻辑

尝试访问我的应用会产生 ERR_TOO_MANY_REDIRECTS;相当多的 302 显然都指向自身。执行 GET /auth/saml/callback 会产生以下有用的错误(不知道 /users/ 是如何或为什么会出现在前面的;我是否需要请求更改 ACS URL 或者这是我可以控制的?):

任何见解或帮助将不胜感激。

编辑:似乎问题在于 user_saml_omniauth_authorize_path 被设置为 /users/auth/saml ——而不是直接设置为 IDP 登录页面。我对这条路线没有明确的控制器,但显然需要为其他控制器登录意味着我需要为这个控制器登录。最终结果是,正如一些人所建议的,我们得到了一个无限重定向循环。

【问题讨论】:

  • 使用 sso gem。
  • 不客气。

标签: ruby-on-rails devise ruby-on-rails-5 omniauth saml-2.0


【解决方案1】:

关于重定向循环:由于您有before_action :authenticate_user!,它会将任何未经身份验证的请求引导至用户登录页面。我的猜测是您的登录页面上也有相同的回调。因此,在每次重定向到/sign_in 时,rails 都会通过此authenticate_user! 并再次重定向它,因为用户未通过身份验证。要使其正常工作,您必须在您登录的控制器中 skip_before_action :authenticate_user!(我认为是 SessionsController)。

至于你的第二个问题——正确的授权路径。答案在您提供的屏幕截图中,位于错误下方。你可以在那里看到正确的路径是/users/auth/samlusers/auth/saml/callback

更新:默认情况下,用户会从 Devise 前置(使用您的可设计模型名称)

【讨论】:

  • 登录应该在身份管理服务器上,不是吗?
  • 也就是说 - 我希望重定向到在 devise.rbconfig.omniauth 哈希中定义的 idp_sso_target_url。
猜你喜欢
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多