/** Builder of SubjectLocality objects. */
private SAMLObjectBuilder<SubjectLocality> subjectLocalityBuilder;
+ /** Builder of Endpoint objects. */
+ private SAMLObjectBuilder<Endpoint> endpointBuilder;
+
/** URL of the authentication manager servlet. */
private String authenticationManagerPath;
AuthnContextDeclRef.DEFAULT_ELEMENT_NAME);
subjectLocalityBuilder = (SAMLObjectBuilder<SubjectLocality>) getBuilderFactory().getBuilder(
SubjectLocality.DEFAULT_ELEMENT_NAME);
+ endpointBuilder = (SAMLObjectBuilder<Endpoint>) getBuilderFactory().getBuilder(
+ AssertionConsumerService.DEFAULT_ELEMENT_NAME);
}
/** {@inheritDoc} */
throws ProfileException {
log.debug("Decoding message with decoder binding {}", getInboundBinding());
SSORequestContext requestContext = new SSORequestContext();
+ requestContext.setCommunicationProfileId(getProfileId());
+
requestContext.setMetadataProvider(getMetadataProvider());
requestContext.setSecurityPolicyResolver(getSecurityPolicyResolver());
protected SSORequestContext buildRequestContext(Saml2LoginContext loginContext, HTTPInTransport in,
HTTPOutTransport out) throws ProfileException {
SSORequestContext requestContext = new SSORequestContext();
+ requestContext.setCommunicationProfileId(getProfileId());
requestContext.setMessageDecoder(getMessageDecoders().get(getInboundBinding()));
requestContext.setMetadataProvider(getMetadataProvider());
String relyingPartyId = loginContext.getRelyingPartyId();
+ requestContext.setPeerEntityId(relyingPartyId);
requestContext.setInboundMessageIssuer(relyingPartyId);
- populateSAMLMessageInformation(requestContext);
populateRequestContext(requestContext);
- populateProfileInformation(requestContext);
return requestContext;
}
* @return Endpoint selected from the information provided in the request context
*/
protected Endpoint selectEndpoint(BaseSAMLProfileRequestContext requestContext) {
+ AuthnRequest authnRequest = ((SSORequestContext) requestContext).getInboundSAMLMessage();
+
AuthnResponseEndpointSelector endpointSelector = new AuthnResponseEndpointSelector();
endpointSelector.setEndpointType(AssertionConsumerService.DEFAULT_ELEMENT_NAME);
endpointSelector.setMetadataProvider(getMetadataProvider());
endpointSelector.setEntityRoleMetadata(requestContext.getPeerEntityRoleMetadata());
endpointSelector.setSamlRequest(requestContext.getInboundSAMLMessage());
endpointSelector.getSupportedIssuerBindings().addAll(getSupportedOutboundBindings());
- return endpointSelector.selectEndpoint();
+
+ Endpoint endpoint = endpointSelector.selectEndpoint();
+ if (endpoint == null && authnRequest.getAssertionConsumerServiceURL() != null) {
+ endpoint = endpointBuilder.buildObject();
+ endpoint.setLocation(authnRequest.getAssertionConsumerServiceURL());
+ if (authnRequest.getProtocolBinding() != null) {
+ endpoint.setBinding(authnRequest.getProtocolBinding());
+ } else {
+ endpoint.setBinding(getSupportedOutboundBindings().get(0));
+ }
+ log.warn("No endpoint available for relying party {}. Generating endpoint with ACS url {} and binding {}",
+ new Object[] { requestContext.getPeerEntityId(), endpoint.getLocation(), endpoint.getBinding() });
+ }
+
+ return endpoint;
}
/** Represents the internal state of a SAML 2.0 SSO Request while it's being processed by the IdP. */