使用Devise和OmniAuth-SAML在Rails中设置SAML回调

a p*_*a p 11 ruby-on-rails devise omniauth saml-2.0 ruby-on-rails-5

编辑:附近的附加信息和浓缩问题;)

我正在使用SAML2.0在我正在制作的小应用程序和身份提供程序之间进行集成.

一般来说,我一直在关注Devise页面上的说明,然后是Omniauth-SAML文档.

目前的问题似乎是没有生成回调路径.这是下面的相关代码位; 随时请求其他信息.

应用程序/模型/ 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
Run Code Online (Sandbox Code Playgroud)

应用程序/控制器/ 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
Run Code Online (Sandbox Code Playgroud)

来自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'
Run Code Online (Sandbox Code Playgroud)

根据这里这里的文档,添加超过上面的内容(即将额外的需求放入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' }
Run Code Online (Sandbox Code Playgroud)

但值得注意的是,我还没有手动为回调处理添加任何逻辑

试图访问我的应用程序会产生ERR_TOO_MANY_REDIRECTS; 相当多的302s显然都指向了自己.做一个GET /认证/ SAML /回调产生以下帮助的错误(不知道如何或为何/用户/被前置那里,我需要请求在ACS URL的变化或者这事我管了?):

rails_error_message

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

编辑:看起来问题是user_saml_omniauth_authorize_path设置为/ users/auth/saml - 而不是直接设置IDP登录页面.我没有明确的控制器用于此路由,但显然需要登录OTHER控制器意味着我需要登录此路由器.最终的结果是,正如一些人所建议的那样,我们得到了一个无限的重定向循环.

Kku*_*kis 5

关于重定向循环:因为您有before_action :authenticate_user!任何未经身份验证的请求导致用户登录页面.我的猜测是你在登录页面上也有相同的回调.因此,每次重定向到/sign_inrails都会通过它authenticate_user!重定向它,因为用户未经过身份验证.为了使它正常工作,你必须skip_before_action :authenticate_user!在你有登录的控制器(SessionsController我认为).

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

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