@Override public CompletionStage<Void> beforeInitiatingSso(ServiceRequestContext ctx, HttpRequest req, MessageContext<AuthnRequest> message, SamlIdentityProviderConfig idpConfig) { final String requestedPath = req.path(); if (requestedPath.length() <= 80) { // Relay the requested path by default. final SAMLBindingContext sub = message.getSubcontext(SAMLBindingContext.class, true); assert sub != null : "SAMLBindingContext"; sub.setRelayState(requestedPath); } return CompletableFuture.completedFuture(null); }
@Override public HttpResponse serve(ServiceRequestContext ctx, AggregatedHttpMessage msg, String defaultHostname, SamlPortConfig portConfig) { try { final MessageContext<Response> messageContext; if (cfg.endpoint().bindingProtocol() == SamlBindingProtocol.HTTP_REDIRECT) { messageContext = HttpRedirectBindingUtil.toSamlObject(msg, SAML_RESPONSE, idpConfigs, defaultIdpConfig); } else { messageContext = HttpPostBindingUtil.toSamlObject(msg, SAML_RESPONSE); } final String endpointUri = cfg.endpoint().toUriString(portConfig.scheme().uriText(), defaultHostname, portConfig.port()); final Response response = messageContext.getMessage(); final Assertion assertion = getValidatedAssertion(response, endpointUri); // Find a session index which is sent by an identity provider. final String sessionIndex = assertion.getAuthnStatements().stream() .map(AuthnStatement::getSessionIndex) .filter(Objects::nonNull) .findFirst().orElse(null); final SAMLBindingContext bindingContext = messageContext.getSubcontext(SAMLBindingContext.class); final String relayState = bindingContext != null ? bindingContext.getRelayState() : null; return ssoHandler.loginSucceeded(ctx, msg, messageContext, sessionIndex, relayState); } catch (SamlException e) { return ssoHandler.loginFailed(ctx, msg, null, e); } }
/** {@inheritDoc} */ @Override @Nullable @NotEmpty public String getEntityId() { if (super.getEntityId() == null) { setEntityId(resolveEntityId()); } return super.getEntityId(); }
/** {@inheritDoc} */ @Override @Nullable public String apply(@Nullable final RelyingPartyContext input) { final BaseContext ctx = input != null ? input.getRelyingPartyIdContextTree() : null; if (ctx != null) { if (ctx instanceof SAMLPeerEntityContext) { return ((SAMLPeerEntityContext) ctx).getEntityId(); } else if (ctx instanceof SAMLSelfEntityContext) { return ((SAMLSelfEntityContext) ctx).getEntityId(); } } return null; }
public final SAMLMetadataContext getSAMLPeerMetadataContext() { return getSAMLPeerEntityContext().getSubcontext(SAMLMetadataContext.class, true); }
public final SPSSODescriptor getSPSSODescriptor() { final SAMLMetadataContext selfContext = getSAMLSelfMetadataContext(); final SPSSODescriptor spDescriptor = (SPSSODescriptor) selfContext.getRoleDescriptor(); return spDescriptor; }
/** {@inheritDoc} */ @Override protected void doInvoke(MessageContext messageContext) throws MessageHandlerException { messageContext.getSubcontext(SAMLProtocolContext.class, true).setProtocol(samlProtocol); messageContext.getSubcontext(entityContextClass, true).setRole(peerRole); }
/** {@inheritDoc} */ @Override @Nullable public EntityDescriptor apply(@Nullable SAMLMetadataContext input) { if (null == input) { return null; } return input.getEntityDescriptor(); }
/** {@inheritDoc} */ @Override @Nullable public String apply(@Nullable final SAMLProtocolContext input) { if (input != null) { return input.getProtocol(); } else { return null; } }
/** {@inheritDoc} */ @Override @Nullable public DateTime apply(@Nullable final SAMLMessageInfoContext input) { if (input != null) { return input.getMessageIssueInstant(); } else { return null; } }
/** {@inheritDoc} */ @Override @Nullable public AttributeConsumingService apply(@Nullable final AttributeConsumingServiceContext input) { if (null == input) { return null; } return input.getAttributeConsumingService(); }
/** {@inheritDoc} */ @Override @Nullable public String apply(@Nullable final SAMLMessageInfoContext input) { if (input != null) { return input.getMessageId(); } else { return null; } }
/** * Gets the issue instant of the message. * * @return issue instant of the message */ @Nullable public DateTime getMessageIssueInstant() { if (issueInstant == null) { issueInstant = resolveIssueInstant(); } return issueInstant; }
public final SAMLMetadataContext getSAMLSelfMetadataContext() { return getSAMLSelfEntityContext().getSubcontext(SAMLMetadataContext.class, true); }
@Override public CompletionStage<Void> beforeInitiatingSso(ServiceRequestContext ctx, HttpRequest req, MessageContext<AuthnRequest> message, SamlIdentityProviderConfig idpConfig) { message.getSubcontext(SAMLBindingContext.class, true) .setRelayState(req.path()); return CompletableFuture.completedFuture(null); }
/** {@inheritDoc} */ @Override @Nullable public String apply(@Nullable final MessageContext input) { if (input != null) { final SAMLPeerEntityContext peerCtx = input.getSubcontext(SAMLPeerEntityContext.class); if (peerCtx != null) { return peerCtx.getEntityId(); } final SAMLSelfEntityContext selfCtx = input.getSubcontext(SAMLSelfEntityContext.class); if (selfCtx != null) { return selfCtx.getEntityId(); } } return null; }
public final IDPSSODescriptor getIDPSSODescriptor() { final SAMLMetadataContext peerContext = getSAMLPeerMetadataContext(); final IDPSSODescriptor idpssoDescriptor = (IDPSSODescriptor) peerContext.getRoleDescriptor(); return idpssoDescriptor; }
final SAMLBindingContext bindingContext = arg.messageContext.getSubcontext(SAMLBindingContext.class); final String relayState = bindingContext != null ? bindingContext.getRelayState() : null;
/** * Converts an {@link AggregatedHttpMessage} which is received from the remote entity to * a {@link SAMLObject}. */ static <T extends SAMLObject> MessageContext<T> toSamlObject(AggregatedHttpMessage msg, String name) { final SamlParameters parameters = new SamlParameters(msg); final byte[] decoded; try { decoded = Base64.getMimeDecoder().decode(parameters.getFirstValue(name)); } catch (IllegalArgumentException e) { throw new SamlException("failed to decode a base64 string of the parameter: " + name, e); } @SuppressWarnings("unchecked") final T message = (T) deserialize(decoded); final MessageContext<T> messageContext = new MessageContext<>(); messageContext.setMessage(message); final String relayState = parameters.getFirstValueOrNull(RELAY_STATE); if (relayState != null) { final SAMLBindingContext context = messageContext.getSubcontext(SAMLBindingContext.class, true); assert context != null; context.setRelayState(relayState); } return messageContext; }
final SAMLBindingContext context = messageContext.getSubcontext(SAMLBindingContext.class, true); assert context != null; context.setRelayState(relayState);