让我在这个问题的开头说,我是SAML的新手,几乎不了解它是如何工作的。
我正在使用gem和Rails 4应用程序来实现SSO。Rails应用程序充当服务提供商(SP)。为了测试我的设置,我创建了一个OneLogin开发者帐户,并使用以下属性设置了一个SAML测试连接器(IdP w/attr w/sign response):
设置页
SSO选项卡
>
十、 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是如何在后台工作的。
该元数据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行 问题答案: 通常文件带有奇怪的格式。 您需要删除它的第一部分(包括注释和说明)和最后两行: 解析器不知道如何处理这些情况,如果删除这两行,就可以了。