Atlassian uses cookies to improve your browsing experience, perform analytics and research, and conduct advertising. Accept all cookies to indicate that you agree to our use of cookies on your device.
Atlassian uses cookies to improve your browsing experience, perform analytics and research, and conduct advertising. Accept all cookies to indicate that you agree to our use of cookies on your device. Atlassian cookies and tracking notice, (opens new window)
The Shibboleth IdP V4 software has reached its End of Life and is no longer supported. This documentation is available for historical purposes only. See the IDP5 wiki space for current documentation on the supported version.
ExternalAuthnConfiguration
Current File(s):conf/authn/external-authn-config.xml, conf/authn/authn.properties (V4.1+) Format: Native Spring, Properties (V4.1+)
The authn/External login flow supports the use of an arbitrary external (to the IdP) authentication mechanism. Its basic function is to provide a non-WebFlow-based integration strategy for new authentication mechanisms. As a rule, using WebFlow is better and safer, but it does require writing Java code in most cases. This is usually true for external mechanisms also, but they can in some cases be implemented with JSP alone.
By default, the External flow is defined to lack support for advanced controls such as passive or forced authentication, but this can be changed if your integration supports these features.
This login handler usually requires additional code be written in order to trigger the external authentication system. If you're simply looking to authenticate based on the presence of REMOTE_USER, refer to the RemoteUser flow.
Once control is transferred to the external path, the IdP has no control over what happens, and it will implicitly trust any information passed back through the defined interface. If that information can be manipulated, security holes may result. The deployer takes full responsibility for the security of the overall exchange.
Enabling Module (V4.1+)
For V4.1+, configuring and using this feature requires that you first enable the "idp.authn.External" module if it isn't already enabled. Systems upgraded from older releases generally come pre-enabled due to the prior state of the configuration tree.
Use conf/authn/external-authn-config.xml to configure this flow. The shibboleth.authn.External.externalAuthnPath bean defines the flow redirection path to the resource that's used to perform the external login, by default a context-relative location. It can be modified if needed, but must be a resource with access to the container session. Modify as needed to match the location of your external interface (see the documentation on flow redirects).
Most of the usual options are available via authn/authn.properties, and some more advanced cases will require defining/adjusting bean definitions in authn/external-authn-config.xml. The idp.authn.External.externalAuthnPath property defines the flow redirection path to the resource that's used to perform the external login, by default a context-relative location. It can be modified if needed, but must be a resource with access to the container session. Modify as needed to match the location of your external interface (see the documentation on flow redirects).
You may also dynamically derive the path to use, typically so that it can vary based on aspects of the request, by defining a bean named shibboleth.authn.External.externalAuthnPathStrategy of type Function<ProfileRequestContext,String>.
The shibboleth.authn.External.ClassifiedMessageMap is a map of exception/error messages to classified error conditions. You can make use of this map either by modifying it to understand the error or exception messages returned by your external code, or by using the map as is and passing back the literal tokens in the map from your external code via the exception or error message interface.
API
The ExternalAuthentication class makes up the interface between the external code and the IdP. The general flow is:
Call ExternalAuthentication.startExternalAuthentication(HttpServletRequest), saving off the result as a key.
Do work as necessary (reading request details from the attributes below). Any redirects must preserve the key value returned in step 1 because it must be used to complete the login later.
Set request attributes to communicate the result of the login back.
Call ExternalAuthentication.finishExternalAuthentication(String, HttpServletRequest, HttpServletResponse). The first parameter is the key returned in step 1.
Collection of IdPAttribute objects to associate with the authenticated subject
doNotCache
Boolean
If true, prevents the result from being saved for future use for SSO
previousResult
Boolean
If true, the "new" AuthenticationResult is created with the "previousResult" flag set to true (mainly impacts auditing)
Only one "result" or error attribute should be set by the external code. Setting more than one has unspecified behavior. In most cases, the simple principalName should be returned on success, but you can return the more complex objects to pass back additional information such as public or private credentials or custom principal data.
Any IdPAttribute objects supplied will be processed by the AttributeFilter service as "inbound" data. If at least one value in the "authnAuthorities" attribute is supplied, it is set as the "issuer" of the attributes for the purposes of the filter evaluation.
Note that returning a Subject is often paired with setting the shibboleth.authn.External.addDefaultPrincipals bean (V4.0) or idp.authn.External.addDefaultPrincipals property (V4.1+) to false, to dynamically establish Principal(s) representing the authentication method used without having them overwritten.
For example, your External flow's supportedPrincipals property might be defined to include both password and multi-factor authentication Principals (meaning it supports both methods), but you can return the specific method used at runtime in the Subject. For SAML 2.0, this is typically done (programmatically) by using the net.shibboleth.idp.saml.authn.principal.AuthnContextClassRefPrincipal class with the appropriate value from the standard or a deployment. Other classes in that package address SAML 1.1 and unusual SAML 2.0 use cases. For the built-in constants defined by the standard, there are Java constants available via org.opensaml.saml.saml2.core.AuthnContext.
Reference
The beans defined, or expected to be defined, in authn/external-authn-config.xml follow: Bean ID / Type Default Description shibboleth.authn.External.externalAuthnPath String contextRelative:external.jsp Spring Web Flow redirection expression for the protected resource shibboleth.authn.External.externalAuthnPathStrategy Function<ProfileRequestContext,String> Optional function that returns the redirection expression to use for the protected resource shibboleth.authn.External.ClassifiedMessageMap Map<String,List<String>> (see file) A map between defined error/warning conditions and events and implementation-specific message fragments to map to them. shibboleth.authn.External.resultCachingPredicate Predicate<ProfileRequestContext> Optional bean that can be defined to control whether to preserve the authentication result in an IdP session shibboleth.authn.External.addDefaultPrincipals Boolean true Whether to add the content of the supportedPrincipals property of the underlying flow descriptor to the resulting Subject shibboleth.authn.External.matchExpression Pattern Regular expression to match username against
The beans defined, or expected to be defined, in authn/external-authn-config.xml follow: Bean ID / Type Default Description shibboleth.authn.External.externalAuthnPathStrategy Function<ProfileRequestContext,String> Optional function that returns the redirection expression to use for the protected resource shibboleth.authn.External.ClassifiedMessageMap Map<String,List<String>> (see file) A map between defined error/warning conditions and events and implementation-specific message fragments to map to them. shibboleth.authn.External.resultCachingPredicate Predicate<ProfileRequestContext> Optional bean that can be defined to control whether to preserve the authentication result in an IdP session
The flow-specific properties usable via authn/authn.properties are: Name Default Description idp.authn.External.externalAuthnPath contextRelative:external.jsp Spring Web Flow redirection expression for the protected resource idp.authn.External.matchExpression Regular expression to match username against The general properties configuring this flow via authn/authn.properties are: Name Default Description idp.authn.External.order 1000 Flow priority relative to other enabled login flows (lower is "higher" in priority) idp.authn.External.nonBrowserSupported false Whether the flow should handle non-browser request profiles (e.g., ECP) idp.authn.External.passiveAuthenticationSupported false Whether the flow allows for passive authentication idp.authn.External.forcedAuthenticationSupported false Whether the flow supports forced authentication idp.authn.External.proxyRestrictionsEnforced %{idp.authn.enforceProxyRestrictions:true} Whether the flow enforces upstream IdP-imposed restrictions on proxying idp.authn.External.proxyScopingEnforced false Whether the flow considers itself to be proxying, and therefore enforces SP-signaled restrictions on proxying idp.authn.External.discoveryRequired false Whether to invoke IdP-discovery prior to running flow idp.authn.External.lifetime %{idp.authn.defaultLifetime:PT1H} Lifetime of results produced by this flow idp.authn.External.inactivityTimeout %{idp.authn.defaultTimeout:PT30M} Inactivity timeout of results produced by this flow idp.authn.External.reuseCondition shibboleth.Conditions.TRUE Bean ID of Predicate<ProfileRequestContext> controlling result reuse for SSO idp.authn.External.activationCondition shibboleth.Conditions.TRUE Bean ID of Predicate<ProfileRequestContext> determining whether flow is usable for request idp.authn.External.subjectDecorator
Bean ID of BiConsumer<ProfileRequestContext,Subject> for subject customization idp.authn.External.supportedPrincipals (see below) Comma-delimited list of protocol-specific Principal strings associated with flow idp.authn.External.addDefaultPrincipals true Whether to auto-attach the preceding set of Principal objects to each Subject produced by this flow Most of the flows, including this one, default to describing themselves in terms of "password"-based authentication, so the supportedPrincipals property defaults to the following XML: <list>
<bean parent="shibboleth.SAML2AuthnContextClassRef"
c:classRef="urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" />
<bean parent="shibboleth.SAML2AuthnContextClassRef"
c:classRef="urn:oasis:names:tc:SAML:2.0:ac:classes:Password" />
<bean parent="shibboleth.SAML1AuthenticationMethod"
c:method="urn:oasis:names:tc:SAML:1.0:am:password" />
</list> In property form, this is expressed as (note especially the trailing commas, which MUST be there): idp.authn.External.supportedPrincipals = \
saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport, \
saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:Password, \
saml1/urn:oasis:names:tc:SAML:1.0:am:password
To replace the internally defined flow descriptor bean, the following XML is required: <util:list id="shibboleth.AvailableAuthenticationFlows">
<bean p:id="authn/External" parent="shibboleth.AuthenticationFlow"
p:order="%{idp.authn.External.order:1000}"
p:nonBrowserSupported="%{idp.authn.External.nonBrowserSupported:false}"
p:passiveAuthenticationSupported="%{idp.authn.External.passiveAuthenticationSupported:false}"
p:forcedAuthenticationSupported="%{idp.authn.External.forcedAuthenticationSupported:false}"
p:proxyRestrictionsEnforced="%{idp.authn.External.proxyRestrictionsEnforced:%{idp.authn.enforceProxyRestrictions:true}}"
p:proxyScopingEnforced="%{idp.authn.External.proxyScopingEnforced:false}"
p:discoveryRequired="%{idp.authn.External.discoveryRequired:false}"
p:lifetime="%{idp.authn.External.lifetime:%{idp.authn.defaultLifetime:PT1H}}"
p:inactivityTimeout="%{idp.authn.External.inactivityTimeout:%{idp.authn.defaultTimeout:PT30M}}"
p:reuseCondition-ref="#{'%{idp.authn.External.reuseCondition:shibboleth.Conditions.TRUE}'.trim()}"
p:activationCondition-ref="#{'%{idp.authn.External.activationCondition:shibboleth.Conditions.TRUE}'.trim()}"
p:subjectDecorator="#{getObject('%{idp.authn.External.subjectDecorator:}'.trim())}">
<property name="supportedPrincipalsByString">
<bean parent="shibboleth.CommaDelimStringArray"
c:_0="#{'%{idp.authn.External.supportedPrincipals:}'.trim()}" />
</property>
</bean>
</util:list> In older versions and upgraded systems, this list is defined in conf/authn/general-authn.xml. In V4.1+, no default version of the list is provided and it may simply be placed in conf/global.xml if needed.