Spring安全SAML:获取块以显示在
我很难让SpringSecuritySAML与ADFS2.0一起工作 根据我当前的配置,生成的AuthnRequest如下所示:- https://localhost:8443/helix/saml/metadata 但是,它会在ADFS端导致错误:-Spring安全SAML:获取块以显示在,spring,spring-security,saml-2.0,adfs,spring-saml,Spring,Spring Security,Saml 2.0,Adfs,Spring Saml,我很难让SpringSecuritySAML与ADFS2.0一起工作 根据我当前的配置,生成的AuthnRequest如下所示:- https://localhost:8443/helix/saml/metadata 但是,它会在ADFS端导致错误:- Microsoft.IdentityModel.Protocols.XmlSignature.SignatureVerificationFailedException: MSIS0038: SAML Message has wrong signa
Microsoft.IdentityModel.Protocols.XmlSignature.SignatureVerificationFailedException: MSIS0038: SAML Message has wrong signature. Issuer: 'https://localhost:8443/helix/saml/metadata'.
at Microsoft.IdentityServer.Protocols.Saml.Contract.SamlContractUtility.CreateSamlMessage(MSISSamlBindingMessage message)
at Microsoft.IdentityServer.Service.SamlProtocol.SamlProtocolService.CreateErrorMessage(CreateErrorMessageRequest createErrorMessageRequest)
at Microsoft.IdentityServer.Service.SamlProtocol.SamlProtocolService.ProcessRequest(Message requestMessage)
我的安全团队告诉我,我的AuthnRequest应该是这样的:-
https://localhost:8443/helix/saml/metadata
S8r/XbIhlFGFSMfLoSt/7IlksiI=
TT4n3==。。。
MIIC8z。。。
urn:oasis:name:tc:SAML:2.0:ac:classes:Password
。。。但是,我在尝试使块出现在我的AuthnRequest中时遇到困难
我当前的Spring Security SAML配置如下所示。。。很抱歉,这是相当冗长,但我不确定什么粘贴在这里除了整个配置
@配置
@启用Web安全性
公共抽象类SecuritySAMLConfig扩展了WebSecurity配置适配器{
私有静态最终字符串元数据\u URL=https://server/federationmetadata/2007-06/federationmetadata.xml;
私有静态最终字符串别名=apollo;
私有静态最终字符串存储\u PASS=secret;
@自动连线
私有SAMLUserDetailsServiceImpl SAMLUserDetailsServiceImpl;
@自动连线
私有SAMLAuthenticationProvider SAMLAuthenticationProvider;
@豆子
公共静态SAMLBootstrap SAMLBootstrap{
返回新的CustomSamlBootstrap;
}
@豆子
公共车速发动机车速发动机{
返回速度Factory.getEngine;
}
@BeaninitMethod=初始化
公共StaticBasicParserPool parserPool{
返回新的StaticBasicParspool;
}
@Beanname=parserPoolHolder
公共ParserPoolHolder ParserPoolHolder{
返回新的ParserPoolHolder;
}
@豆子
公共多线程HttpConnectionManager多线程HttpConnectionManager{
返回新的多线程HttpConnectionManager;
}
@豆子
公共HttpClient httpClientMultiThreadedHttpConnectionManager多线程HttpConnectionManager{
返回新的HttpClientmultiThreadedHttpConnectionManager;
}
@豆子
公共SAMLAuthenticationProvider SAMLAuthenticationProvider{
SAMLAuthenticationProvider SAMLAuthenticationProvider=新的SAMLAuthenticationProvider;
samlAuthenticationProvider.setUserDetailssamlUserDetailsServiceImpl;
samlAuthenticationProvider.setforceprincipalstringfalse;
返回samlAuthenticationProvider;
}
@豆子
公共SAMLContextProviderImpl contextProvider{
返回新的SAMLContextProviderImpl;
}
@豆子
公共SAMLDefaultLogger samlLogger{
返回新的SAMLDefaultLogger;
}
@豆子
公共网站ProfileConsumer网站ProfileConsumer{
返回新的WebsProfileConsumerImpl;
}
@豆子
公共网站ProfileConsumerHokWebssoProfileConsumer{
返回新的网站soprofileconsumerhokimpl;
}
@豆子
公共网站配置文件网站配置文件{
返回新的WebsProfileImpl;
}
@豆子
公共网站ProfileConsumerHokWebssoProfile{
返回新的网站soprofileconsumerhokimpl;
}
@豆子
公共网站ProfileECPIMPL ecpprofile{
返回新的WebsProfileECPIMPL;
}
@豆子
公共单logoutprofile logoutprofile{
返回新的SingleLogoutProfileImpl;
}
@豆子
公钥管理器密钥管理器{
DefaultResourceLoader=新的DefaultResourceLoader;
Resource storeFile=loader.getResourceclasspath:keystore.jks;
映射密码=新HashMap;
passwords.putALIAS,STORE_PASS;
返回新的JKSKeyManagerstoreFile、STORE_PASS、密码、别名;
}
@豆子
公共网站配置文件选项网站配置文件选项{
返回新的WebsProfileOptions;
}
@豆子
公共SAMLEntryPoint SAMLEntryPoint网站soprofileoptions网站soprofileoptions{
SAMLEntryPoint SAMLEntryPoint=新的SAMLEntryPoint;
SamlentPoint.SetDefaultProfileOptions网站配置文件选项;
返回samlEntryPoint;
}
@豆子
公共扩展元数据扩展元数据{
ExtendedMetadata ExtendedMetadata=新的ExtendedMetadata;
extendedMetadata.SetIdDiscoveryEnabledFalse;
//
//理论上,通过设置这些密钥,签名块应该出现,
//但是,这对我不起作用
//
extendedMetadata.setSignMetadatatrue;
extendedMetadata.setSigningKeyALIAS;
extendedMetadata.setEncryptionKeyALIAS;
//
返回扩展元数据;
}
@豆子
公共ExtendedMetadataDelegate extendedMetadataDelegateHttpClient httpClient,
ParserPool ParserPool,
ExtendedMetadata ExtendedMetadata引发MetadataProviderException{
Timer backgroundTaskTimer=新Timertrue;
HTTPMetadataProvider HTTPMetadataProvider=新的HTTPMetadataProviderbackgroundTaskTimer,
httpClient,
元数据地址;
httpMetadataProvider.setParserPoolparserPool;
ExtendedMetadataDelegate ExtendedMetadataDelegate=新的ExtendedMetadataDelegatehttpMetadataProvider,
扩展元数据;
extendedMetadataDelegate.setMetadataTrustCheckfalse;
返回extendedMetadataDelegate;
}
@豆子
public CachingMetadataManager metadataExtendedMetadataDelegate extendedMetadataDelegate引发MetadataProviderException{
列表提供程序=新的ArrayList;
providers.addextendedMetadataDelegate;
返回新的CachingMetadataManagerproviders;
}
@豆子
公共元数据生成器metadataGeneratorExtendedMetadata extendedMetadata,KeyManager KeyManager{
MetadataGenerator MetadataGenerator=新的MetadataGenerator;
metadataGenerator.setExtendedMetadataextendedMetadata;
metadataGenerator.setIncludeDiscoveryExtensionfalse;
metadataGenerator.SetKeyManagerMarkeyManager;
返回元数据生成器;
}
@豆子
公共MetadataDisplayFilter MetadataDisplayFilter{
返回新的MetadataDisplayFilter;
}
@豆子
public SavedRequestAwareAuthenticationSuccessHandler SavedRequestAwareAuthenticationSuccessHandler{
SavedRequestStataWareAuthenticationSuccessHandler successRedirectHandler=新的SavedRequestStataWareAuthenticationSuccessHandler;
successRedirectHandler.setDefaultTargetUrl/landing;
返回成功重定向处理程序;
}
@豆子
公共SimpleRuThenticationFailureHandler SimpleRuThenticationFailureHandler{
SimpleRulAuthenticationFailureHandler failureHandler=新SimpleRulAuthenticationFailureHandler;
failureHandler.setUseForwardtrue;
failureHandler.setDefaultFailureUrl/error;
返回故障处理器;
}
@豆子
公共SamlWebSShokProcessingFilter SamlWebSShokProcessingFiltersSavedRequestaWareAuthenticationSuccessHandler savedRequestAwareAuthenticationSuccessHandler,
AuthenticationManager AuthenticationManager,
SimpleRulAuthenticationFailureHandler SimpleRulAuthenticationFailureHandler引发异常{
SamlWebSShokProcessingFilter SamlWebSShokProcessingFilter=新的SamlWebSShokProcessingFilter;
SamlWebSShokProcessingFilter.SetAuthenticationSuccessHandlerSavedRequestStataWareAuthenticationSuccessHandler;
SamlWebSShokProcessingFilter.SetAuthenticationManager身份验证管理器;
SamlWebSShokProcessingFilter.SetAuthenticationFailureHandler SimpleRuThenticationFailureHandler;
返回SamlWebSShokProcessingFilter;
}
@豆子
公共SAMLProcessingFilter samlProcessingFilterAuthenticationManager authenticationManager,
SavedRequestStataWareAuthenticationSuccessHandler SavedRequestStataWareAuthenticationSuccessHandler,
SimpleRulAuthenticationFailureHandler SimpleRulAuthenticationFailureHandler引发异常{
SAMLProcessingFilter samlWebSSOProcessingFilter=新的SAMLProcessingFilter;
samlWebSSOProcessingFilter.SetAuthenticationManager身份验证管理器;
samlWebSSOProcessingFilter.SetAuthenticationSuccessHandlerSavedRequestStataWareAuthenticationSuccessHandler;
samlWebSSOProcessingFilter.SetAuthenticationFailureHandler SimpleRuThenticationFailureHandler;
返回samlWebSSOProcessingFilter;
}
@豆子
公共元数据生成器筛选器元数据生成器筛选器元数据生成器筛选器元数据生成器元数据生成器元数据生成器{
返回新的MetadataGeneratorFiltermetadataGenerator;
}
@豆子
公共SIMPLEURLOGOUTSCCESS处理程序SIMPLEURLOGOUTSCCESS处理程序{
SimpleRullogoutSuccessHandler successLogoutHandler=新SimpleRullogoutSuccessHandler;
successLogoutHandler.setDefaultTargetUrl/;
返回successLogoutHandler;
}
@豆子
公共安全ContextLogoutHandler安全ContextLogoutHandler{
SecurityContextLogoutHandler logoutHandler=新的SecurityContextLogoutHandler;
logoutHandler.setInvalidateHttpSessiontrue;
logoutHandler.setClearAuthenticationtrue;
返回logoutHandler;
}
@豆子
公共SAMLLogoutProcessingFilter samlLogoutProcessingFilterSimpleUrlLogoutSuccessHand
ler SimpleRullogoutsuccessHandler,
SecurityContextLogoutHandler SecurityContextLogoutHandler{
返回新的SAMLLogoutProcessingFiltersimpleUrlLogoutSuccessHandler、securityContextLogoutHandler;
}
@豆子
公共SAMLLogoutFilter samlLogoutFilterSimpleUrlLogoutSuccessHandler SIMPLEURGOUTSCCessHandler,
SecurityContextLogoutHandler SecurityContextLogoutHandler{
返回新的SAMLLogoutFiltersimpleUrlLogoutSuccessHandler,
新LogoutHandler[]{securityContextLogoutHandler},
新LogoutHandler[]{securityContextLogoutHandler};
}
@豆子
公共HttpPartFactBinding工件BindingHttpSoap11Binding httpSOAP11Binding,
HttpClient HttpClient,
ParserPool ParserPool,
速度发动机速度发动机{
ArtifactResolutionProfileImpl artifactResolutionProfile=新的ArtifactResolutionProfileImplhttpClient;
artifactResolutionProfile.setProcessornew SamlProcessorImplHttpSoap11绑定;
返回新的HttpPartFactBindingParserPool、velocityEngine、artifactResolutionProfile;
}
@豆子
公共HTTPSOAP11Binding httpSOAP11BindingParserPool parserPool{
返回新的HTTPSOAP11BindingparserPool;
}
@豆子
公共HTTPPostBinding httpPostBindingParserPool parserPool,VelocityEngine VelocityEngine{
返回新的HTTPPostBindingparserPool,velocityEngine;
}
@豆子
公共HTTPRedirectDeflateBinding httpRedirectDeflateBindingParserPool parserPool{
返回新的HTTPRedirectDeflateBindingparserPool;
}
@豆子
公共HttpPaoS11绑定HttpPaoS11绑定解析波尔解析波尔{
返回新的HTTPPAOS11BindingparserPool;
}
@豆子
公共样本处理器MPL处理器httpRedirectDeflateBinding httpRedirectDeflateBinding,
HTTPPostBinding HTTPPostBinding,
HttpPartFactBinding HttpPartFactBinding,
HttpSOAP11绑定HttpSOAP11绑定,
HttpPaoS11绑定HttpPaoS11绑定{
集合绑定=新的ArrayList;
bindings.addhttpRedirectDeflateBinding;
bindings.addhttpPostBinding;
bindings.addHttpPartFactBinding;
bindings.addHttpSoap11绑定;
bindings.addHttpPaos11绑定;
返回新的SAMLProcessorImplbindings;
}
@豆子
公共过滤器链氧气过滤器链氧气采样点采样点,
SAMLLogoutFilter SAMLLogoutFilter,
MetadataDisplayFilter MetadataDisplayFilter,
SAMLProcessingFilter SAMLProcessingFilter,
SamlWebSShokProcessingFilter SamlWebSShokProcessingFilter,
SAMLLogoutProcessingFilter SAMLLogoutProcessingFilter引发异常{
列表链=新的ArrayList;
chains.addnew DefaultSecurityFilterChainnew AntPathRequestMatcher/saml/login/**,SamlentPoint;
chains.addnew DefaultSecurityFilterChainnew AntPathRequestMatcher/saml/logout/**,samlLogoutFilter;
chains.addnew DefaultSecurityFilterChainnew AntPathRequestMatcher/saml/metadata/**,
metadataDisplayFilter;
chains.addnew DefaultSecurityFilterChainnew AntPathRequestMatcher/saml/SSO/**,samlProcessingFilter;
chains.addnew DefaultSecurityFilterChainnew AntPathRequestMatcher/saml/sshok/**,
SamlWebsshokProcessingFilter;
chains.addnew DefaultSecurityFilterChainnew AntPathRequestMatcher/saml/SingleLogout/**,
samlLogoutProcessingFilter;
返回新的过滤器链氧链;
}
@豆子
@凌驾
公共AuthenticationManager authenticationManagerBean引发异常{
返回super.authenticationManagerBean;
}
@凌驾
受保护的无效配置AuthenticationManagerBuilder身份验证引发异常{
auth.authenticationProvidersamlAuthenticationProvider;
}
}
如果有人能把我推向正确的方向,我将不胜感激
多谢各位
更新
MetadataGenerator生成的我的SP元数据如下所示:-
MIICx。。。。
MIICxz。。。。
urn:oasis:names:tc:SAML:1.1:nameid格式:emailAddress
urn:oasis:names:tc:SAML:2.0:nameid-
格式:瞬态
urn:oasis:names:tc:SAML:2.0:nameid格式:持久
urn:oasis:names:tc:SAML:1.1:nameid格式:未指定
urn:oasis:names:tc:SAML:1.1:nameid格式:X509SubjectName
我还想指出,我使用SHA256和RSA,而不是SHA1和RSA。因此,我用以下内容替换默认的SAMLBootstrap bean:-
公共最终类CustomSamlBootstrap扩展了SAMLBootstrap{
@凌驾
public void后处理BeanFactoryConfigurableListableBeanFactoryBeanFactory引发BeanException{
super.postProcessBeanFactorybeanFactory;
BasicSecurity配置配置=BasicSecurity配置配置。GetGlobalSecurity配置;
config.registerSignatureAlgorithmURIRSA,SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA256;
config.setSignatureReferenceDigestMethodSignatureConstants.ALGO_ID_DIGEST_SHA256;
}
}
更新2
我通过修改WebsProfileOptions使其正常工作
@豆子
公共网站配置文件选项网站配置文件选项{
websoprofileoptions websoprofileoptions=新的websoprofileoptions;
websoprofileoptions.setIncludeScopingfalse;
//增加了这一行
websoprofileoptions.setBindingSAMLConstants.SAML2\u POST\u BINDING\u URI;
返回WebsProfileOptions;
}
您使用什么绑定将请求发送到IDP?如果是HTTP请求,SAML标准要求在传递消息之前删除签名。然后对序列化请求执行签名,并将其作为GET参数发送。我认为您应该设置:
@Bean
public MetadataGenerator metadataGenerator(ExtendedMetadata extendedMetadata, KeyManager keyManager) {
MetadataGenerator metadataGenerator = new MetadataGenerator();
// ... other configuration here
metadataGenerator.setRequestSigned ( true );
return metadataGenerator;
}
在ExtendedMetadata中,您只设置要签名的元数据文件。这不会影响AuthnRequest的签名。感谢您的回复。如何验证/检查正在使用的绑定?我以为我是通过HTTP Post发送的,但我认为我的绑定是错误的,因为我的安全团队告诉我ADFS将以查询参数字符串的形式接收我的响应,这意味着我使用的是as GET而不是Post。对于我的WebsProfileOptions,绑定设置为urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Post。当设置为较早或urn:oasis:names:tc:SAML:2.0:bindings:HTTP重定向时,AuthnRequest中的ProtocolBinding始终显示为urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST。我通过添加生成的SP元数据按POST进行更新,并使用SHA256withRSA而不是SHA1 withRSA。非常感谢。