当前位置: 首页 > 知识库问答 >
问题:

Rails/designe/SAML元数据不正确(不使用PingFederate)

拓拔富
2023-03-14

让我在这个问题的开头说,我是SAML的新手,几乎不了解它是如何工作的。

我正在使用gem和Rails 4应用程序来实现SSO。Rails应用程序充当服务提供商(SP)。为了测试我的设置,我创建了一个OneLogin开发者帐户,并使用以下属性设置了一个SAML测试连接器(IdP w/attr w/sign response):

设置页

  • 观众:mysubdomain.onelogin.com
  • 收件人:http://mysubdomain.myapp.local:3000/saml/auth
  • ACS(消费者)URL验证器:^http://mysubdomain.myapp.local:3000/saml/auth$
  • ACS(消费者)网址:http://mysubdomain.myapp.local:3000/saml/auth
  • 单个注销URL:http://mysubdomain.myapp.local:3000/saml/idp_sign_out

SSO选项卡

>

  • 发卡机构URL:https://app.onelogin.com/saml/metadata/589819
  • SAML 2.0endpoint(HTTP):https://mysubdomain.onelogin.com/trust/saml2/http-post/sso/589819
  • SLOendpoint(HTTP):https://mysubdomain.onelogin.com/trust/saml2/http-redirect/slo/589819
  • SAML签名算法:SHA-1
  • SHA指纹:60:9D:18:56:B9:80:D4:25:63:C1:CC:57:6D:B9:06:7C:78:BB:2C:F1
  • 十、 509证书:

    -----开始证书------MIIEFzCCAv gAwIBAgIUQYRVa1MQpUh0gJaznmXSF/SPqnowDQYJKoZIhvcNAQEF bqawdelmakga1uebhmcvvmxetapbngnvbbaomcezpcm1qbgf5mruwewydvqqqldaxp bmvmb2dpbizfaxhzadbgnvbammfk9uxvz2luiefjy291bnqgoti1mzewhhcn mtywotixmtu0nzqwwwjbymqwcqydvqgewjvuzerma8g a1uecgwirm lybvbsyxkxftatbgnvbasmde9uzuxvz2luielkudefmb0ga1ueawwT25LTG9NAW4GQWNWJB3VUDCA5MJUZMTCCASIWDQYJKOZIHVCNAQEBBQADGGEGAPDCC AQOCGGEGBALGGOCBJ0CIHM3UKLWICOFPHOTZJW1XPADNYNAVPTBCL7WE5 sLBoQ ZF oZ7Dl wRW6DHMJCl9DdKcOaQA6/GR5BWT78IZ8HWMOKEQEPIH E0km6rKLYA8 M52VXTJGS8IQX60QVPQFEPMOA xg73OExfM7W5LnXwNz/PXGSR3LBIFOC76J SaTCFroV TSJV FOAYMW/lZrsS79KRIzA9I5XwUBe3bC8bsfQmZXgddCrkQUNSGGaS 7/jtFUlQ94 lAL l3yoAiNAE6 mt48qqmyLfkKibXvnZ8dwuO272wpY4fEM vFRyPyrtajqvhy3hyiq8dlw3omine5vecl8caweaaob2dcb1tambgnvhmbaf8eajaa mb0ga1uddgqwbbsbxuivtpxwohh2pupid tuykcetecetcblqydvr0jbignmiggbsx iuvTPxwOhh2pupID tuykceaefcowwdelmakga1ebhmcvmxetapbgnvbaom cezpcm1qbgf5mruwydvqqqqdaxpbmb2dpbizfaxhzadbgnvbammfk9uxv z2luiefjy291bngoti1mzgcfvwttkvm IDICWS55L0HF0J6P6MA4GA1UDDWeb/WQEAWIHGDANBGKQHKIG9W0BAQUFAAOCAQEQEAYBE 5d3zpLZ7fcf3l3rXYeIxcpN9D2YZCbxsrBhY2Am4YE9nN RAJXEDQERBNTPAYCZVFHNXEXRO1N7WXWTMOSIYE7SY2XZF 3feQreF25atnn4tzVhxYONaX1njZMIt/TNa7A9aeDfHSD vwSuYYB hGxKT6HOkEAEBiXCZ/FcVNiB0D8bRwQhiJ3BTzXDfqHrmq8QYdn3Ejlqo62vMl6W XEMXUYV6CUC64AP6E XTEQI1E8YB5R8GTTS3Y1OA2D6YYCYVJ20 Hi7IWAqXC EFQSTQ xb7foq2rat39cepnu1soarveydmwyiavnf3hoydbybjjsawancq==----结束证书-----

    在我的devise.rb中,我有以下配置:

    config.saml_create_user = false
    config.saml_update_user = true
    config.saml_default_user_key = :email
    config.saml_session_index_key = :session_index
    config.saml_use_subject = true
    config.idp_settings_adapter = IdPSettingsAdapter
    config.idp_entity_id_reader = DeviseSamlAuthenticatable::DefaultIdpEntityIdReader
    

    这是我的IdPSettingsAdapter:

    class IdPSettingsAdapter
        def self.settings(idp_entity_id)
            company = Company.find_by(idp_entity_id: idp_entity_id)
    
            if company.present?
                {
                    assertion_consumer_service_url: company.assertion_consumer_service_url,
                    assertion_consumer_service_binding: company.assertion_consumer_service_binding,
                    name_identifier_format: company.name_identifier_format,
                    issuer: company.issuer,
                    idp_entity_id: company.idp_entity_id,
                    authn_context: company.authn_context,
                    idp_slo_target_url: company.idp_slo_target_url,
                    idp_sso_target_url: company.idp_sso_target_url,
                    idp_cert_fingerprint: company.idp_cert_fingerprint
                }
            else
                {}
            end
        end
    end
    

    请注意,我的用户模型联系人属于公司,SSO设置存储在公司模型中。

    以下是我的saml路线:

    devise_for :contacts, skip: :saml_authenticatable, controllers: {
        registrations: "registrations",
        sessions: "sessions",
        passwords: "passwords",
        confirmations: "confirmations"
    }
    devise_scope :contact do
        get '/sign_in' => 'sessions#new'
        get '/sign_out' => 'sessions#destroy'
    
        # SSO Routes
        get 'saml/sign_in' => 'saml_sessions#new', as: :new_user_sso_session
        post 'saml/auth' => 'saml_sessions#create', as: :user_sso_session
        get 'saml/sign_out' => 'saml_sessions#destroy', as: :destroy_user_sso_session
        get 'saml/metadata' => 'saml_sessions#metadata', as: :metadata_user_sso_session
        match 'saml/idp_sign_out' => 'saml_sessions#idp_sign_out', via: [:get, :post]
    end
    

    最后是我的SamlSessionsController:

    require "ruby-saml"
    
    class SamlSessionsController < SessionsController
        include DeviseSamlAuthenticatable::SamlConfig
        skip_before_filter :verify_authenticity_token, raise: false
        before_action :authorize_viewer, except: [:metadata]
        protect_from_forgery with: :null_session, except: :create
    
        def new
            idp_entity_id = Company.friendly.find(@_request.env['HTTP_HOST'].split('.')[0]).idp_entity_id
            request = OneLogin::RubySaml::Authrequest.new
            action = request.create(saml_config(idp_entity_id))
            redirect_to action
        end
    
        def metadata
            idp_entity_id = Company.friendly.find(@_request.env['HTTP_HOST'].split('.')[0]).idp_entity_id
            meta = OneLogin::RubySaml::Metadata.new
            render :xml => meta.generate(saml_config(idp_entity_id)), content_type: 'application/samlmetadata+xml'
        end
    
        def create
            @idp_entity_id = Company.friendly.find(@_request.env['HTTP_HOST'].split('.')[0]).idp_entity_id
            response = OneLogin::RubySaml::Response.new(params[:SAMLResponse], settings: saml_config(@idp_entity_id))
    
            if !response.is_valid?
                puts "SAML FAILED WITH ERROR: "
                puts response.errors
            end
            super
        end
    
        def idp_sign_out
            company = Company.friendly.find(request.subdomain.downcase)
            idp_entity_id = Company.friendly.find(@_request.env['HTTP_HOST'].split('.')[0]).idp_entity_id
    
            if params[:SAMLRequest] && Devise.saml_session_index_key
                saml_config = saml_config(idp_entity_id)
                logout_request = OneLogin::RubySaml::SloLogoutrequest.new(params[:SAMLRequest], settings: saml_config(idp_entity_id))
                resource_class.reset_session_key_for(logout_request.name_id)
    
                # binding.pry
                sign_out current_contact if contact_signed_in?
                redirect_to company.after_slo_url.present? ? company.after_slo_url : 'https://' + company.issuer
                # redirect_to generate_idp_logout_response(saml_config(idp_entity_id), logout_request.id)
            elsif params[:SAMLResponse]
                #Currently Devise handles the session invalidation when the request is made.
                #To support a true SP initiated logout response, the request ID would have to be tracked and session invalidated
                #based on that.
                if Devise.saml_sign_out_success_url
                    redirect_to Devise.saml_sign_out_success_url
                else
                    redirect_to action: :new
                end
            else
                head :invalid_request
            end
        end
    
        protected
    
        # Override devise to send user to IdP logout for SLO
        def after_sign_out_path_for(_)
            request = OneLogin::RubySaml::Logoutrequest.new
            request.create(saml_config)
        end
    
        def generate_idp_logout_response(saml_config, logout_request_id)
            OneLogin::RubySaml::SloLogoutresponse.new.create(saml_config, logout_request_id, nil)
        end
    end
    

    当我手动将OneLogin适配器中的设置映射到我的Company模型(参见屏幕截图)时,我能够使用OneLogin作为身份提供者(IdP)作为我的应用程序的用户进行身份验证。但是现在我需要向客户端提供代表应用程序设置的XML元数据。当我转到/saml/metadata.xml时,我得到以下配置,根据我的客户端,这是不正确的。客户端没有提供有关问题所在的任何进一步细节。如果这很重要的话,他们正在使用平联邦。

    <?xml version='1.0' encoding='UTF-8'?>
    <md:EntityDescriptor ID='_a3581975-b73d-4784-a106-bafd61e15f87' xmlns:md='urn:oasis:names:tc:SAML:2.0:metadata'>
        <md:SPSSODescriptor AuthnRequestsSigned='false' WantAssertionsSigned='false' protocolSupportEnumeration='urn:oasis:names:tc:SAML:2.0:protocol'>
            <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
            <md:AssertionConsumerService Binding='urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST' Location='https://mysubdomain.myapp.local:3000/saml/auth' index='0' isDefault='true'/>
        </md:SPSSODescriptor>
    </md:EntityDescriptor>
    

    我的问题是,我在这里做错了什么,我该如何纠正?正如我所说,我几乎不理解SAML是如何在后台工作的。

  • 共有1个答案

    梁丘扬
    2023-03-14

    该元数据XML上没有定义EntityID。如果您尝试在验证工具上验证XML,您将获得

    行:2 |列:0--

    如果您查看ruby saml代码,则EntityID将添加到元数据XML中(如果设置不正确)。发行人已定义。你能确认是否提供了这些数据吗?也许是公司。我在IdPSettingsAdapter类中看到的颁发者有一个空值。

     类似资料:
    • 我正试图写一个C程序来计算元音、键击和字母字符的数量。击键计数器正在工作,但是元音计数器总是关闭一个元音。阿尔法计数器坏了。

    • 问题内容: SimpleHttpConnectionManager使用不正确。确保始终调用HttpMethod.releaseConnection(),并且一次只有一个线程和/或方法正在使用此连接管理器。 是否有人知道为什么会出现此错误,并导致我要下载的文件失败或失败,然后重试或下载未完成的文件 谢谢 ! 问题答案: 确保不使用SimpleHttpConnectionManager创建和使用来自多

    • 我在Rails(3.2.1)中有一个路由问题。 我正在使用omniauth saml进行身份验证(https://github.com/PracticallyGreen/omniauth-saml). 医生说: “用于简化IdP中SAML SP配置的服务提供商元数据可以从http://example.com/auth/saml/metadata.将此URL发送给IdP的管理员。" 当我转到我的服务

    • 我使用SSOCIRCE实现了Spring SAML示例应用程序,效果很好。现在我一直在尝试为客户的ADF实现它。以下是我认为需要的配置,如果我错了,请纠正我: 将下面的第一个参数更改为federationMetadata。客户端提供的xml url 我还没有弄明白以下几点: 我只收到了adfs/的url/联邦元数据。xml,谁应该创建SP元数据 我是否应该创建SP元数据并提供给客户端,以便将其添加

    • 设置JAVA_OPTS=-xmx8192m-xms8192m-xmn4096m 我开始不一致地得到堆错误。 尝试_java_options

    • 问题内容: 我正在使用SentiWordNet做一些情绪分析,我在这里提到了如何使用SentiWordNet的帖子。但是,尽管尝试了各种输入,但我仍得到0.0分。我在这里做错什么了吗?谢谢! 这是SentiWordNet.txt的前10行 问题答案: 通常文件带有奇怪的格式。 您需要删除它的第一部分(包括注释和说明)和最后两行: 解析器不知道如何处理这些情况,如果删除这两行,就可以了。