此帖中任何不正确的术语都要提前道歉。我们不是SAML专家,并且一直关注各种宝石README和论坛/博客文章,以便我们在设置中尽可能地。
我们需要创建一个与IDP的SAML集成,这需要签名'握手'在允许我们的应用程序传递到其登录页面之前。我们已经使用Rails omniauth-saml gem(https://github.com/omniauth/omniauth-saml)设置了SAML,并成功测试了与Okta的集成。但是,我们尝试整合的IDP不接受我们的AuthnRequest。根据他们的日志,我们认为这与我们的SAMLRequest未正确签名有关。 omniauth-saml文档没有提供有关签名请求的任何信息,但是我们能够在OneLogin ruby-saml gem中找到omniauth-saml gem构建的信息(https://github.com/onelogin/ruby-saml)。我们已将onelogin / ruby-saml中提到的签名服务设置为true并添加了签名方法和摘要方法,但我们的SAMLRequest似乎仍未正确签名。 这是我们的设置信息:
# we set security
security = {authn_requests_signed: true, embed_sign: true, metadata_signed: true, soft: false, signature_method: XMLSecurity::Document::RSA_SHA1, digest_method: XMLSecurity::Document::SHA1}
idp_metadata.merge(
certificate: EXAMPLE_PUBLIC_CERT,
private_key: EXAMPLE_PRIVATE_CERT,
# we're using the environment variable here because each deploy of
# our app has a different domain name
issuer: "https://" + ENV['MAIL_HOST'] + "/users/auth/saml/metadata",
assertion_consumer_service_url: "https://" + ENV['MAIL_HOST'] + "/users/auth/saml/callback",
assertion_consumer_service_binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST",
# these attributes are set elsewhere
request_attributes: attributes,
security: security
)
我们使用omniauth-saml生成的路径通过SAMLRequest GET参数重定向到IDP:user_saml_omniauth_authorize_path
我们无法找到有关应传递给authorize_path的其他参数的任何信息,以强制签名或沿着这些行进行任何操作。
我们的理解是,如果我们的SAMLRequest正确签名,SAMLRequest的使用者将需要来自我们的元数据xml的509Certificate信息进行解码,但我们能够在通用OneLogin解码器中解码SAMLRequest而无需其他信息。
任何帮助强制Authn签署我们的SAMLRequest的帮助都将非常感谢。