Plugin Referenz - Airlock IAM 8.6.0
Plugin Index
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Z
Abort Step
errorCode) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) stepId) customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: AbortStep
id: AbortStep-xxxxxx
displayName:
comment:
properties:
customFailureResponseAttributes:
customResponseAttributes:
errorCode:
preCondition:
requiresActivation: false
skipCondition:
stepId:
Accepted SSO Tickets Clean-up Task
Task to clean up expired accepted SSO tickets entries from the database.
It is recommended to schedule this task during a time with little traffic. Depending on the number of expired accepted SSO tickets, the task may take some time to complete.
Note: The clean up task ignores tenant IDs, all expired SSO tickets are deleted regardless of their tenant IDs.
acceptedSsoTicketRepository) Defines the accepted SSO ticket repository from which expired tickets are to be removed.
Note that this repository may be different from the one configured in the service container which stores accepted SSO tickets used to access it and rejects previously accepted ones.
batchSize) During clean-up, accepted SSO tickets are deleted in batches of this size.
This ensures that any row locks on the database are very short-lived, not affecting parallel ticket insertions. This value should not be set too high to prevent very long running transactions. Accepted SSO ticket clean-up will repeat deleting this number of tickets until all expired tickets have been cleaned up. Therefore, this task can take some time when a lot of accepted SSO tickets are present.
This size should be chosen so that every batch does not take longer than 5 seconds. The average runtime of the batches can be found in the task's logs.
type: AcceptedSsoTicketsCleanupTask
id: AcceptedSsoTicketsCleanupTask-xxxxxx
displayName:
comment:
properties:
acceptedSsoTicketRepository:
batchSize: 1000
Accepting Authenticator
There are no configuration properties.
The plugin writes the canonical class name description of this plugin to the context data container. The class name is stored under the key authPluginClassName . A short description of this authentication method is stored under the key authMethodShortDesc . This information may be used by callers.
type: AcceptingAuthenticator
id: AcceptingAuthenticator-xxxxxx
displayName:
comment:
properties:
Accepting Password Service
type: AcceptingPasswordService
id: AcceptingPasswordService-xxxxxx
displayName:
comment:
properties:
Access Cookie Identity Propagator
This plugin performs a HTTP POST request with the username and the password the user entered on a login form to the configured application and it expects this application to set an access cookie. This access cookie is then set to the response object involved in the identity propagation process.
This plugin requires that the caller of the identity propagator puts the username and the password into the parameter map. The username must be stored under the key USERNAME and the password under the key PASSWORD.
The plugin is thought to be used in situations where there is a legacy application providing access cookies after a weak authentication process (username and password) and these access cookie should be used in a different authenticaiton process for telling other legacy applications (that are "used to" the access cookie) about the authenticated user.
accessCookieSourceUrl) See note in plug-in description when using SSL (HTTPS instead of HTTP).
httpParamUsername) httpParams) In many cases, the submit button value must be sent to an application to make it think that the button has been pressed.
httpParamPassword) allowOnlyTrustedCerts) Only allow connections to servers whose certificate is trusted. See documentation of property "Trust Store Path" for more information about what certificates are trusted.
Security warning: Trusting all certificates allows connections to adversarial hosts. Only disable this property for testing and integration setups.
verifyServerHostname) Enables hostname verification, i.e. the actual hostname must be the same as in the server certificate.
Security warning: Not verifying the hostname may allow connections to adversarial hosts, e.g. if they employ DNS spoofing. Only disable this property for testing and integration setups.
trustStorePath) If this property is not defined the following certificate issuers are trusted:
- The list of issuers known to the Java VM if the system property "javax.net.ssl.trustStore" is not defined.
- The list of issuers in a keystore referenced by system property "javax.net.ssl.trustStore" if defined in instance.properties using iam.java.opts
If this property is defined then the following certificate issuers are trusted:
- The list of issuers in the referenced truststore file and no others.
This property is only relevant if the property "Allow Only Trusted Certs" is enabled.
trustStoreType) trustStorePassword) Depending on the keystore type, leaving this property empty (or undefined) has a different effect:
- In keystores like JKS, the keystore can be opened and used but the integrity of the keystore is not checked.
- In keystores like PKCS12, the keystore cannot be opened an an error occurs.
connectTimeout) correlationIdHeaderName) When configured, all requests sent contain a header with the correlation ID with the configured name. If no value or an empty value is specified, the correlation ID header is not sent.
If the correlation ID is not defined, the correlation ID header is not included in sent requests.
proxyHost) proxyPort) proxyLoginUser) proxyLoginPassword) cookies)
type: AccessCookieIdentityPropagator
id: AccessCookieIdentityPropagator-xxxxxx
displayName:
comment:
properties:
accessCookieSourceUrl:
allowOnlyTrustedCerts: true
connectTimeout: 10
cookies:
correlationIdHeaderName:
httpParamPassword:
httpParamUsername:
httpParams:
proxyHost:
proxyLoginPassword:
proxyLoginUser:
proxyPort:
trustStorePassword:
trustStorePath:
trustStoreType: JKS
verifyServerHostname: true
Account Link Consistency User Change Listener
- on user deletion: delete all account links assigned to that user.
- on user name change: update the account links to the new user name.
persisterConfig)
type: AccountLinkConsistencyUserChangeListener
id: AccountLinkConsistencyUserChangeListener-xxxxxx
displayName:
comment:
properties:
persisterConfig:
Account Link Database Repository
sqlDataSource) tableName) sequenceName) tenantId) If no value is configured, then 'no_tenant' is used as value on the database.
logQueries)
type: AccountLinkDatabasePersister
id: AccountLinkDatabasePersister-xxxxxx
displayName:
comment:
properties:
logQueries: false
sequenceName:
sqlDataSource:
tableName: account_link
tenantId:
Account Link Linking Initiation Step
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: AccountLinkLinkingInitiationStep
id: AccountLinkLinkingInitiationStep-xxxxxx
displayName:
comment:
properties:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Account Link Management
accountLinkPersister)
type: AccountLinkManagement
id: AccountLinkManagement-xxxxxx
displayName:
comment:
properties:
accountLinkPersister:
Account Link Management UI
Depending on the configuration, the user interface allows an authenticated user:
- to delete an account link.
- to add an account link.
The account link management interface is accessible at /<loginapp-uri>/ui/app/protected/account-links after user authentication.
flowToLinkAccount) flowToUnlinkAccount) pageExitTarget) If configured, an additional button is displayed on the account link management to exit the page. On click, this button redirects the user to the configured target.
To redirect to a target application, redirect to the corresponding "Authentication Flow". If the flow can be skipped due to the obtained tags, the user is directly forwarded to the target application.
type: AccountLinkManagementUi
id: AccountLinkManagementUi-xxxxxx
displayName:
comment:
properties:
flowToLinkAccount:
flowToUnlinkAccount:
pageExitTarget:
Account Link Management UI Redirect
type: AccountLinkManagementFlowRedirectTarget
id: AccountLinkManagementFlowRedirectTarget-xxxxxx
displayName:
comment:
properties:
Account Link Removal Initiation Step
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: AccountLinkDeletionInitiationStep
id: AccountLinkDeletionInitiationStep-xxxxxx
displayName:
comment:
properties:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Account Linking Lists Self Services
accessCondition) Precondition that must be fulfilled for a user to access the account link and provider list.
Note the difference to the "Authorization Condition":- Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
authorizationCondition) - Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
type: AccountLinkingListsSelfServiceRest
id: AccountLinkingListsSelfServiceRest-xxxxxx
displayName:
comment:
properties:
accessCondition:
authorizationCondition:
Account Linking Required Red Flag
name)
type: AccountLinkingRequiredRedFlag
id: AccountLinkingRequiredRedFlag-xxxxxx
displayName:
comment:
properties:
name: OAUTH2_ACCOUNT_LINKING_REQUIRED
Account Linking Required Red Flag Condition
redFlag)
type: AccountLinkingRequiredCondition
id: AccountLinkingRequiredCondition-xxxxxx
displayName:
comment:
properties:
redFlag:
Account Linking Self Service
askForConfirmationBeforeLinking) accountInfo) This property is helpful to display data that uniquely and understandably identifies an account, e.g. to display the user's email if available.
type: AccountLinkingSelfService
id: AccountLinkingSelfService-xxxxxx
displayName:
comment:
properties:
accountInfo:
askForConfirmationBeforeLinking: true
Ace Radius Token Verifier
This plug-in supports multiple ACE/RSA servers and failover.
The ACE server must be installed/configured to support RADIUS. Here are some configuration hints (may be different for more recent ACE server versions):
- RADIUS support must be activated.
- Create an agent host of type "Unix Agent" with the name and the IP of the host running this client. This makes sure that the ACE server accepts RADIUS requests from the client host.
- Activate the users you like to use on the just created agent host.
Since the RADIUS protocol does not know anything about the different challenge responses (next token required, new pin required, etc.), some RSA/ACE server versions encode them in the state attribute (like a session id). This implementation can check for these special state values and behave accordingly. This is the default setting. If the next token mode (and new pin mode) does not work properly, enable the property Interpret Challenge Messages. In this case, this plug-in intreprets the reply messages rather than the special state attributes.
radiusServers) Non-backward compatibility: Before hierarchical plugins were released, the RadiusServer informations were all configured directly in this plugin with a comma separated list. This must be converted by hand.
interpretChallengeMessages) TRUE, this plug-in will look at the reply messages in RADIUS responses. The messages are used to distinguish next-token-mode, new-pin-mode, and new-pin-accepted-mode.
If the property is set to
FALSE (default), this plugin interprets the RADIUS state attribute to make this distinction. This is may not work with newer RSA/ACE servers. nasIdentifier)
type: AceRadiusTokenVerifier
id: AceRadiusTokenVerifier-xxxxxx
displayName:
comment:
properties:
interpretChallengeMessages: false
nasIdentifier:
radiusServers:
Acknowledge Message Step
This can be used for example to inform users about a concrete event happening inside the flow, e.g., a successful mandatory password change, steps inside user self-registration, etc. This step can return a static message ID or a message that was generated by the server. At least one has to be configured. The message ID expects the client to display a corresponding message, while the server message is composed on the server and can therefore contain dynamic properties available in the IAM flow.
The message ID and the server message will both be provided as an additional attribute inside the flow response under the key messageId and serverMessage respectively.
messageId) serverMessage) interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: AcknowledgeMessageStep
id: AcknowledgeMessageStep-xxxxxx
displayName:
comment:
properties:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
messageId:
onFailureGotos:
preCondition:
requiresActivation: false
serverMessage:
skipCondition:
stepId:
tagsOnSuccess:
ACR to Flow Application ID Mapping
acrValue) flowApplicationId)
type: OpenIdConnectAcrToApplicationId
id: OpenIdConnectAcrToApplicationId-xxxxxx
displayName:
comment:
properties:
acrValue:
flowApplicationId:
Active Authentication Method
authMethod)
type: AuthMethodBasedCondition
id: AuthMethodBasedCondition-xxxxxx
displayName:
comment:
properties:
authMethod:
Active Directory Authentication Failure Mapper
- data 525 - user not found
- data 52e - invalid credentials
- data 530 - not permitted to logon at this time
- data 531 - not permitted to logon at this workstation
- data 532 - password expired
- data 533 - account disabled
- data 701 - account expired
- data 773 - user must reset password
- data 775 - user account locked
type: ActiveDirectoryAuthenticationFailureMapper
id: ActiveDirectoryAuthenticationFailureMapper-xxxxxx
displayName:
comment:
properties:
Active Directory Connector
General Information
If a Microsoft Active Directory is used to manage the users, only this Plugin needs to be configured to handle the different user-related directory tasks. This MS AD connector implements the Airlock IAM Plugin interfaces: Authenticator, UserIterator, LicenseUserCounter, UserPersister, CredentialPersister, PasswordService, PasswordPolicy, and PasswordAuthenticator
- Only standard Active Directory user attributes are used. Therefore its not necessary to extend the schema.
- Active Directory features like recursive group membership, password policies and password histories are supported.
- Changing passwords is possible when the connection to the AD is secured using SSL/TLS.
- Multiple AD servers can be configured for failover or load balancing.
- Multiple "User Search Bases" and "Group Search Bases" can be specified.
This plugin works best with Microsoft Active Directory server 2008R2 and later.
Note on Stealth-Mode (Zero-Information Leakage)
This plugin provides "stealth" in the sense that it does not reveal information about the factor that prevented the successful login but it does not provide protection against denial of service attacks based on locking user accounts.
If used in conjunction with the "Stealth Mode" (see "Main Authenticator" plugin), it is strongly recommended to enable the "soft account lock" feature of this plugin (see property below).
Note on using this plugin only for password checks
When only using this plugin to check the user's password, additional features like role lookup or context data retrieval may not work as expected.
connectionPool) isReadOnly) If enabled, the Active Connector plugin does not write any data to the AD except for new passwords (changing and setting passwords can be disabled in the global password settings).
This allows using a service account user with only few privileges.
If enabled, the following data is not written to the AD (and therefore some features may not work as expected):
- Context data (e.g. changes to user's postal address)
- Credential data (e.g. change of mobile phone number)
- User unlocking (after password change or from the Adminapp)
- Enforcing password change (after setting a new password in the Adminapp)
Note that individual context attributes can be made read-only using the configuration property "Read-Only Attributes".
userIdAttributeName) credentialDataAttribute) The LDAP attribute with credential data (e.g. mobile phone number for mTAN/SMS authentication or email address for certificate validation).
If the same attribute is listed in the property "Binary Attributes", it will be treated as binary data, otherwise it is assumed to be UTF-8 string data.
This property is only required when an additional credential should be checked besides the password.
userSearchBases) The separate property "User Search Scope" controls whether users are only searched in the nodes defined by this property or in its subtrees as well.
userSearchScope) - ONE_LEVEL: Search users only in the specified "User Search Bases" - the subtree is ignored.
- SUBTREE: Search users recursively in the specified "User Search Bases" - considers the complete subtree.
- SUBORDINATE_SUBTREE: Search users recursively in the specified "User Search Bases" - considers the complete subtree from one level below the specified "User Search Bases" and ignores users directly in it.
- BASE: Only the exact entries in the specified "User Search Bases" are considered.
userSearchFilter) LDAP search filter expression applied when searching for users.
Note that this filter is automatically combined (logical AND) with a username filter based on the "Username Attribute".
The format and interpretation of filter follow RFC 2254.
Example 1 - Consider only entries with object class user: (objectCategory=user)
Example 2 - Consider only entries with object class person: (objectClass=person)
Example 3 - Consider only users in a specific group (no nested groups): (&(objectCategory=Person)(memberOf=cn=snakeOilDepartment,ou=groups,dc=company,dc=com))
Example 4 - Same as example 1 but considering nested groups: (&(objectCategory=Person)(memberOf:1.2.840.113556.1.4.1941:=cn=snakeOilDepartment,ou=groups,dc=company,dc=com))
usernameConversionPattern) Regular expression pattern containing a group (a region embraced by parentheses) that can be used in conjunction with property "Username Conversion Replacement" in order to transform the username before it is used for searching the user in the directory. If the username does not match the pattern at all, no transformation is performed.
Example: The pattern "(.*)" and the replacement pattern "user.$1" will transform the username "jdoe" to "user.jdoe" before it is used in the directory.
Example: The pattern "user\.(.*)" and the replacement pattern "$1" will transform the username "user.jdoe" to "jdoe" before it is used in the directory.
usernameConversionReplacement) groupSearchBases) Groups/roles are not searched if this property is not configured.
The separate property "Group Search Scope" controls whether groups are only searched in the nodes defined by this property or in its subtrees as well.
groupSearchScope) - ONE_LEVEL: Search groups only in the specified "Group Search Bases" - the subtree is ignored.
- SUBTREE: Search groups recursively in the specified "Group Search Bases" - considers the complete subtree.
- SUBORDINATE_SUBTREE: Search groups recursively in the specified "Group Search Bases" - considers the complete subtree from one level below the specified "Group Search Bases" and ignores groups directly in it.
- BASE: Only the exact entries in the specified "Group Search Bases" are considered.
groupSearchFilter) Note that this filter is automatically combined (logical AND) with a username filter based on the "Username Attribute".
The format and interpretation of filter follow RFC 2254.
resolveNestedGroups) Notice that in any case, only groups in the "Group Search Bases" will be found.
staticRoles) roleFilters) matchRolesCaseSensitive) useGroupsFromMemberOfAttribute) Note that nested roles can NOT be resolved via the memberOf attribute. This can only be done using the groups search. The role lookup through the memberOf attribute is readonly, as is the lookup through the groups search.
searchResultPageSize) If set to a value greater than zero and the Active Directory supports the SimplePaging control, "paging" is enabled for LDAP searches: This property defines the number of entries to fetch at once when searching in a directory.
This setting may be useful if the Active Directory limits the number of entries in a search result.
If the property is set to zero (the default) or if the server does not announce to support the SimplePaging control, paging is disabled
suppressSubstringSearch) This may greatly improve search performance in large directories.
softAccountLock) Lock users when they have more than the configured number of successive incorrect password checks on the AD. (E.g.: the value "2" means that 2 incorrect passwords are still OK).
If the number is smaller than the corresponding setting in AD, this allows "soft-locking" the account if accessed via Airlock IAM without actually locking the account on the AD. This feature may be used to prevent AD accounts from being locked by unsuccessful remote logins.
Note: if "Stealth Mode" is used (see "Main Authenticator" plugin), it is strongly recommended to enable this feature.
unlockUserOnPasswordReset) checkServersidePasswordPoliciesOnChange) If enabled the server side password policy is checked when a user changes or resets the password (not when an administrator sets one). This is for example useful to enforce advanced server-side policies like password histories.
Note that the AD might impose further password constraints (e.g. minimal length), that cannot be weakened or disabled with these settings.
contextDataAttributes) Notice: Context data attributes are string based. Values will be read as strings and are converted to string when written.
To prevent attributes from being changed by Airlock IAM/Login, add them also to the list of "Read-only Attributes".
Notice: The attributes "objectGUID" and "ImmutableID" are always considered read-only.
binaryAttributes) Those attributes are Base64 encoded for use in Airlock IAM/Login.
If the attribute name from "Credential Data Attribute" is also listed here, the credential data will be treated as binary.
readOnlyAttributes) userDNContextDataAttribute) This DN is in the format "uid=user,ou=People,dc=company,dc=ch"
userChangeEventListeners) domainDN) passwordSettingsContainerDN) userCountSearchFilter) Note: The user count is relevant for the product license. This filter should therefore describe the set of users who are able to authenticate through Airlock IAM.
adLdsMode)
type: ActiveDirectoryConnector
id: ActiveDirectoryConnector-xxxxxx
displayName:
comment:
properties:
adLdsMode: false
binaryAttributes:
checkServersidePasswordPoliciesOnChange: true
connectionPool:
contextDataAttributes:
credentialDataAttribute: mobile
domainDN:
groupSearchBases:
groupSearchFilter: (objectClass=group)
groupSearchScope: SUBTREE
isReadOnly: false
matchRolesCaseSensitive: true
passwordSettingsContainerDN:
readOnlyAttributes:
resolveNestedGroups: true
roleFilters:
searchResultPageSize: 1000
softAccountLock:
staticRoles:
suppressSubstringSearch: false
unlockUserOnPasswordReset: true
useGroupsFromMemberOfAttribute: false
userChangeEventListeners:
userCountSearchFilter:
userDNContextDataAttribute:
userIdAttributeName: sAMAccountName
userSearchBases:
userSearchFilter: (objectCategory=user)
userSearchScope: SUBTREE
usernameConversionPattern:
usernameConversionReplacement:
Active Directory Password Policy
Note: This plugin does only check against certain requirements of the current password if this information is made available in the user data (e.g. latest-password-change-timestamp). Whether this is the case, may depend on the configuration of the underlying user persister.
activeDirectoryConnector)
type: ActiveDirectoryPasswordPolicy
id: ActiveDirectoryPasswordPolicy-xxxxxx
displayName:
comment:
properties:
activeDirectoryConnector:
Active Directory Password Policy Connector
connectionPool) domainDN) passwordSettingsContainerDN) userIdAttributeName) searchBases) searchScope) Valid values are SUB and ONE.
searchFilter) The format and interpretation of filter follows RFC 2254.
adLdsMode)
type: ActiveDirectoryPasswordPolicyConnector
id: ActiveDirectoryPasswordPolicyConnector-xxxxxx
displayName:
comment:
properties:
adLdsMode: false
connectionPool:
domainDN:
passwordSettingsContainerDN:
searchBases:
searchFilter: (objectClass=person)
searchScope: SUBTREE
userIdAttributeName: sAMAccountName
Active Directory Password Repository
connector) allowedPasswordValidityDuration) If a password is changed, the 'latest password change timestamp' is set and, if this property is defined, the 'next enforced password change timestamp' is updated.
If this property is not defined, the 'next enforced password change timestamp' is not updated.
type: ActiveDirectoryPasswordRepository
id: ActiveDirectoryPasswordRepository-xxxxxx
displayName:
comment:
properties:
allowedPasswordValidityDuration:
connector:
Actor Claim from Actor Token (OAuth 2.0 Token Exchange)
Sets the act claim to a claim set containing sub and iss claim from the (required) actor token and nests the original act claim from the subject token data into this claim set.
Nesting the act claim within another expresses a chain of delegation. The outermost act claim represents the current actor while nested act claims represent prior actors. The least recent actor is the most deeply nested. The nested act claims serve as a history trail that connects the initial request and subject through the various delegation steps undertaken before reaching the current actor.
type: OAuth2ActorClaimFromActorToken
id: OAuth2ActorClaimFromActorToken-xxxxxx
displayName:
comment:
properties:
Actor Token Unsigned Claims Extractor
Caution: JWT tokens with alg=none are accepted: This may be a security risk.
allowedTokenIssuers)
type: OAuth2ActorTokenUnsignedClaimsExtractor
id: OAuth2ActorTokenUnsignedClaimsExtractor-xxxxxx
displayName:
comment:
properties:
allowedTokenIssuers:
Add Authentee Attribute
radiusAttribute) The suffix of the attribute name gives a hint on the data type that this attribute expects in the context data field:
- NV a named value meaning one of a known set of well string keys as defined in the latest FreeRadius dictionary.
- STRING an UTF8 encoded string.
- INT a number that can be represented by 4 bytes.
- BYTES either a byte array or a base64 encoded string.
- IPV4 either an IPv4 address object, a host name or a raw 4 bytes internet address.
- IPV6 either an IPv6 address object, a host name or a raw 16 bytes internet address.
- DATE either a Date object or a number representing seconds since 1.1.1970.
contextDataField) isSensitive)
type: AddAuthenteeAttribute
id: AddAuthenteeAttribute-xxxxxx
displayName:
comment:
properties:
contextDataField:
isSensitive: true
radiusAttribute:
Add Roles
staticRoles)
type: AddRoleTransformation
id: AddRoleTransformation-xxxxxx
displayName:
comment:
properties:
staticRoles:
Add Scope From Request Parameter
Will add the scopes from the token exchange "scope" request parameter.
If the token exchange "scope" request parameter is not provided or empty, no scopes will be added.
patterns)
type: OAuth2TokenExchangeRequestParameterScopeProcessor
id: OAuth2TokenExchangeRequestParameterScopeProcessor-xxxxxx
displayName:
comment:
properties:
patterns:
Add Scope From Subject Token
Will add the scopes from the subject token's "scope" data.
If the subject token's "scope" data is string-valued, it is parsed as an OAuth 2.0 access token scope as defined in RFC6749. If the subject token's "scope" data is string-valued but its format does not conform with the specification, it will be ignored.
If the subject token's "scope" data is a string array, each value is parsed as a single OAuth 2.0 scope value as defined in RFC6749. If the subject token's "scope" data is an array but any of its values is not a string or does not conform with the specification, the whole array will be ignored.
If the subject token's "scope" data is not present, is neither a string nor a string array, or is an empty array, it will be ignored.
patterns)
type: OAuth2TokenExchangeSubjectTokenScopeProcessor
id: OAuth2TokenExchangeSubjectTokenScopeProcessor-xxxxxx
displayName:
comment:
properties:
patterns:
Add Static Scope
values) The values that will be added to the scope.
Scope tokens must consist of the following characters: %x21 / %x23-5B / %x5D-7E (see RFC6749)
.
type: OAuth2TokenExchangeStaticScopeProcessor
id: OAuth2TokenExchangeStaticScopeProcessor-xxxxxx
displayName:
comment:
properties:
values:
Additional Context Data
Specifies how to determine a read-only context data value using an SQL query.
The query may use ${xxx} variables to refer to database columns in the main object (e.g. user) the context data is added to.
Example (reading a user): SELECT separateColum FROM OTHER_TABLE WHERE username = ${username}
From the result of the query, the first selected column is interpreted as string and used as context data value.
name) query)
type: AdditionalContextData
id: AdditionalContextData-xxxxxx
displayName:
comment:
properties:
name:
query:
Additional Password Check Attribute Map
Note: The actual additional attributes must be configured in the corresponding authentication flow.
type: AdditionalPasswordCheckAttributesValueMapProvider
id: AdditionalPasswordCheckAttributesValueMapProvider-xxxxxx
displayName:
comment:
properties:
Admin Role Specific Setting
requiredRoles) userDataSource) The User Data Source to be used for administrators with matching "Required Admin Roles" configured above.
If not configured, the User Data Source from the Users Configuration is used.
availableUserRoles) Set of roles assignable to users for administrators with matching "Required Admin Roles" configured above.
Translations for the roles displayed in the Adminapp user management UI can be defined using the Adminapp translation keys roles.user.labels.[rolename].
If no roles are configured, the default user roles are used.
type: AdminRoleSpecificSetting
id: AdminRoleSpecificSetting-xxxxxx
displayName:
comment:
properties:
availableUserRoles:
requiredRoles:
userDataSource:
Admin SSO Ticket Request Authentication
queryParameterName) ticketDecoder) The ticket decoder plugin used to decode the SSO ticket.
Security note: If tickets are transported via the web browser (in the URL), they need to be protected. Make sure to use an appropriate ticket decoder securing the ticket (e.g. digitally signed and/or encrypted)!
acceptedSsoTicketRepository) Configures the repository used to store accepted SSO tickets and reject previously accepted ones.
The in-memory repository cannot be used if multiple instances of IAM are deployed in parallel (failover, horizontal scaling). Furthermore, the in-memory repository does not preserve previously accepted SSO tickets across IAM restarts.
contextDataExtractors) usernameKey) providedUsernameKey) The ticket key containing the provided username, which is used for logging and possibly displayed.
This is not combinable with Username Transformation. If the ticket does not contain a provided username, the value from "Username Key" is used.
rolesKey) userStore) usernameTransformers) staticRoles) rolesBlocklist)
type: AdminSsoTicketRequestAuthentication
id: AdminSsoTicketRequestAuthentication-xxxxxx
displayName:
comment:
properties:
acceptedSsoTicketRepository:
contextDataExtractors:
providedUsernameKey:
queryParameterName:
rolesBlocklist:
rolesKey:
staticRoles:
ticketDecoder:
userStore:
usernameKey: username
usernameTransformers:
Adminapp
startPages) users) - Authentication of users
- Management of user credentials and tokens
- Management of users
accessControl) maintenanceMessages) administrators) - Authentication of administrators
- Authorization of administrators
- Management of administrators (optional)
tokens) - Management of tokens
technicalClients) rest) gatewaySettings) If no settings are configured, extra information from the reverse proxy will not be available and it may be harder to correlate log messages that are written to different log files.
eventSettings) serviceContainerSharedSecret) logViewer) realmAdministration) Enables realm administration. This feature limits the rights of administrators to a single realm. All users that a realm administrator creates are assigned to his realm and he can only administer users of his own realm.
The assignment of a realm to an administrator requires super administrator authorization.sessionIdleTimeout) sessionLifetime) sameSitePolicy) Specifies the 'SameSite' cookie attribute of the IAM session cookie 'iam-session-id'. The 'Secure' attribute is automatically set based on whether the request was performed using http or https (see exception for 'None' below).
- Strict: The cookie is not sent in cross-origin requests.
- Lax: The cookie is sent in some cross-origin requests, such as GET requests.
- None: The cookie is sent in cross-origin requests. In this case, the 'Secure' Cookie-Attribute is always set, regardless of whether the request was performed using http or https.Use this setting when using SAML2 in combination with cross-domain POST Bindings.
- No SameSite Attribute: No attribute is set. Browsers apply their default behaviour, usually 'Lax'.
languageSettings) If not set, the default language is German and the allowed languages are German, English and French.
stateRepository) customLoginUrl) The page displayed instead of the default login page. This can be used if authentication is done by an external service.
This value must not be URL encoded. Only URLs starting with "https://" or "http://" are treated as absolute URLs, otherwise the redirect is relative. Furthermore, if the URL starts with "app/" or "/app/" the redirect is performed within the Adminapp UI (context path not needed).
This property can be overridden by the loginUrl URL parameter (see Allowed Login URL Pattern).
afterLogoutUrl) The forward page displayed after the logout if no location parameter is set.
This value must not be URL encoded. Only URLs starting with "https://" or "http://" are treated as absolute URLs, otherwise the redirect is relative. Furthermore, if the URL starts with "app/" or "/app/" the redirect is performed within the Adminapp UI (context path not needed).
This property can be overridden by the afterLogout URL parameter (see Allowed After Logout URL Pattern).
allowedLoginUrlPattern) A regular expression describing the Login URLs that are allowed to be sent to IAM in the loginUrl URL parameter.
A matching URL will be used to redirect users who have not yet authenticated or whose session has expired. If no pattern is configured, no URL will match. Matching URLs will have precedence over the URL configured in Custom Login URL.
allowedAfterLogoutUrlPattern) A regular expression describing the Logout URLs that are allowed to be sent to IAM in the afterLogoutUrl URL parameter.
A matching URL will be used to redirect the user after a successful logout in IAM. If no pattern is configured, no URL will match. Matching URLs will have precedence over the URL configured in After Logout URL.
skin) skinFromParamAllowed) instanceTag) contentSecurityPolicy) Neither the Config Editor nor the Service Container are covered by this CSP.
licenseAnalytics) Airlock IAM always collects and transmits license analytics data, as per our terms and conditions.
In this property, you may enable additional usage data collection to help improve Airlock IAM.
logUserTrailToDatabase) Configures the database settings to use when persisting user trail log entries.
If this value is defined, then all user trail log messages generated by the Adminapp module will additionally be forwarded to the database configured within the referenced repository plugin.
All forwarded log entries are stored inside the table "USER_TRAIL_LOG". Note that setting this value does not disable writing log messages to the Adminapp log file.
correlationIdSettings) Defines settings for correlation ID transfer and logging inside the Adminapp module.
If undefined, no correlation ID will be logged for this module.
customExtensions)
type: Adminapp
id: Adminapp-xxxxxx
displayName:
comment:
properties:
accessControl:
administrators:
afterLogoutUrl: app/login
allowedAfterLogoutUrlPattern:
allowedLoginUrlPattern:
contentSecurityPolicy:
correlationIdSettings:
customExtensions:
customLoginUrl:
eventSettings:
gatewaySettings:
instanceTag:
languageSettings:
licenseAnalytics:
logUserTrailToDatabase:
logViewer:
maintenanceMessages:
realmAdministration:
rest:
sameSitePolicy: LAX
serviceContainerSharedSecret:
sessionIdleTimeout: 30m
sessionLifetime: 8h
skin: blue
skinFromParamAllowed: false
startPages: [viewLog, listUsers, manageTokens]
stateRepository:
technicalClients:
tokens:
users:
Adminapp Content Security Policy
Neither the Config Editor nor the Service Container are covered by this CSP.
contentSecurityPolicy) The default policy requires to insert a nonce into script tags. Script tags that do not include a nonce will be blocked.
The placeholder '${cspNonce}' in the policy will be replaced with a fresh, randomly generated nonce for each request. The same nonce must be present in all policy relevant tags that were generated by a specific request.
Known use cases requiring CSP customization
- IAM is embedded in an (i)frame: frame-ancestors directive must be relaxed.
Security Warning: The default CSP was designed to offer a good level of security and maintainability. The CSP is validated to work with IAM (see limitations above). Defining a custom CSP may reduce the level of security and may lead to browsers blocking IAM pages. Therefore, the security benefits of a custom policy must be evaluated carefully and IAM must be tested to work with the policy.
type: AdminappContentSecurityPolicy
id: AdminappContentSecurityPolicy-xxxxxx
displayName:
comment:
properties:
contentSecurityPolicy: default-src 'self'; object-src 'none'; script-src ${cspNonce} 'strict-dynamic' 'self'; img-src 'self' data:; connect-src 'self'; base-uri 'self'; frame-ancestors 'none';
Adminapp Event Settings
eventSubscribers) outboxRepository) addContextData) If enabled, the context data of the managed user is added as customData to the event.
The data contains all context data values configured in the User Store for loading the managed users. Note that these values might contain sensitive information such as email addresses or phone numbers.
type: AdminappEventSettings
id: AdminappEventSettings-xxxxxx
displayName:
comment:
properties:
addContextData: false
eventSubscribers:
outboxRepository:
Adminapp Language Settings
validLanguages) defaultLanguage) resourcesFilePrefix) Example: If the value of this property is strings, the language dependent files must be "strings_de.properties", "strings_en.properties" and so on and the default file must be "strings.properties".
type: AdminappLanguageSettings
id: AdminappLanguageSettings-xxxxxx
displayName:
comment:
properties:
defaultLanguage: de
resourcesFilePrefix: strings
validLanguages: [de, fr, en]
Adminapp REST API Configuration
smsServiceConfig) requestAuthentication) hashFunction) hashSharedSecret) Can be used together with the 'Hash Function' to externalize session information to the client.
corsSettings) csrfProtection) If enabled, REST endpoints are protected against CSRF attacks.
With this protection, the REST API only accepts requests that contain the custom header X-Same-Domain with an arbitrary non-empty value. In cross-origin resource sharing (CORS), such requests are not considered simple requests and thus must always be preceded by a preflight request, which prevents cross-site request forgery (CSRF) attacks.
Security warning: Disabling this feature may allow CSRF attacks. Only do so if the REST client is unable to comply with the aforementioned restrictions.
usernameTransformers) linkResponseRewritingEnabled) If a 'Base URI' is configured, links are rewritten according to the configured value. Otherwise, links are rewritten according to the external view provided by the WAF (if configured an a WAF environment cookie is present).
baseUri) This property is useful in test environments where you want links contained in REST responses to be relative to the configured base URI. Note that configuring this property will take precedence over link rewriting based on the WAF environment cookie.
Example:
- Property value:
http://myhost:8090/test - The response from the REST call to
/<adminapp-uri>/rest/maintenance-messageswill contain a link tohttp://myhost:8090/test/rest/maintenance-messages.
defaultPageSize) page[limit] query parameter. Must be greater than 0 and smaller than or equal to the 'Max Page Size'. maxPageSize)
type: AdminappRest
id: AdminappRest-xxxxxx
displayName:
comment:
properties:
baseUri:
corsSettings:
csrfProtection: true
defaultPageSize: 500
hashFunction:
hashSharedSecret:
linkResponseRewritingEnabled: true
maxPageSize: 5000
requestAuthentication:
smsServiceConfig:
usernameTransformers:
Administrators Configuration
authenticator) Defines how administrators are authenticated interactively. If only authentication using SSO tickets is required, this property is optional.
Note that the Adminapp authentication UI only support username/password login. Configuring second factors or other authentication means will not work and users will not be able to login.
passwordService) passwordPolicy) ssoTicketAuthentication) If specified, ticket-based single sign-on (SSO) is enabled for the Adminapp: Externally authenticated administrators may access the Adminapp without additional login, provided they bring a valid SSO ticket. The ticket is passed to the Adminapp as URL parameter.
administratorsManagement) usernameTransformers) Username transformation enables authentication with an alias name, by transforming the name entered into the login form to the internal user ID.
The username transformation configured here is only applied to the interactive username/password login.
Transformers can be chained, e,g. a first transformer could normalize the entered name, and the next transformer would then search for a user with a matching context-data field. A transformer can also signal that it already found the final user ID and that no further transformations should be performed.
type: AdministratorsConfiguration
id: AdministratorsConfiguration-xxxxxx
displayName:
comment:
properties:
administratorsManagement:
authenticator:
passwordPolicy:
passwordService:
ssoTicketAuthentication:
usernameTransformers:
Administrators Management
enforceRoleCombinations) assignableRoleCombinations) Defines a list of roles (or combination of roles). Only the specified roles (or combination of roles) can be assigned to the administrators.
Role combinations are specified using comma-separate entries (e.g. "useradmin,tokenadmin"). These combinations can only be assigned to or removed from an admin together. At least one role (or combination of roles) must contain the "superadmin" role.
Translations for the roles displayed in the administrators management UI can be defined using the Adminapp translation keys roles.admin.labels.[rolename], where [rolename] is one of the entries. E.g.:
- roles.admin.labels.useradmin = User Admin
- roles.admin.labels.useradmin,tokenadmin = Special Admin
privilegeEscalationProtectedAdminRoles) Defines a list of protected roles. Operations on an administrator with one of these roles can only be performed by another administrator that also at least has one of these roles assigned.
Each entry contains a single role.
superAdminRole) passwordGenerator) passwordHashFunction) NOTE: Some password hashes, such as SHA 256 Password Hash or Scrypt Password Hash, produce binary output. If one of these is used, make sure the persistence layer supports binary data in the hash field and the corresponding persistence plugins (e.g. Database User Store or Ldap Connector) are configured to treat hash values as binary values.
In case the persistence layer expects a string, encode the password hash by wrapping it with an encoder. To achieve this, use the Password Hash Configuration plugin and specify the hash function (such as Scrypt Password Hash) together with the desired encoder. We recommend using the Base64 Password Hash Encoder.
columnsInAdminList) The data for the columns is taken from the context data container of the available administrators. The configuration of the used admin persister must include the context data properties referenced here.
The columns are displayed in addition to the following columns:
- username
- assigned roles
- locked flag
rowsOnAdminDetailPage) The data for is taken from the context data container of the selected administrator. The configuration of the used admin persister must include the context data properties referenced here.
adminUserStore) lockReasons)
type: AdministratorsManagement
id: AdministratorsManagement-xxxxxx
displayName:
comment:
properties:
adminUserStore:
assignableRoleCombinations:
columnsInAdminList:
enforceRoleCombinations: true
lockReasons: [LockReason.InitiatedByAdmin]
passwordGenerator:
passwordHashFunction:
privilegeEscalationProtectedAdminRoles:
rowsOnAdminDetailPage:
superAdminRole:
Advanced Location Interpreter
- The optional "URI Transformers" are called in the configured order to transform the URI to a new URI. The output of a preceding transformer is used as input of a subsequent transformer. If an URI transformer returns a veto, the default value configured in this plugin is used as the resulting value.
Those plugins are used to perform generic transformations on the URI like regular expression replacements or to use a query parameter as the new URI. - The optional "Value Extractors" are now called in the configured order to extract a string value from the potentially transformed URI. The first extractor able to return a non-empty value stops the chain. If no extractor returns a non-empty value, the whole URI is passed on unchanged.
Those extractors are used to extract a query parameter or a path segment containing the target value. - Finally the optional "String Transformers" are called in the configured order to transform the final string. The output of the preceding transformer is used as input of the subsequent transformer. If a string transformer returns a veto, the default value configured in this plugin is used as overall value.
They can for example be used to normalize values, for example convert the string to lowercase or convert values from one format to another (e.g. convert 'GER' to 'de').
defaultValue) uriTransformers) valueExtractors) stringTransformers)
type: AdvancedLocationInterpreter
id: AdvancedLocationInterpreter-xxxxxx
displayName:
comment:
properties:
defaultValue:
stringTransformers:
uriTransformers:
valueExtractors:
Advanced Migration Selection Option
optionName) Name of the selection option for this migration subflow.
This includes POST /<loginapp-uri>/rest/public/authentication/migration/options/retrieve and POST /<loginapp-uri>/rest/public/authentication/migration/options/<id>/select
steps) condition)
type: AdvancedMigrationSelectionOption
id: AdvancedMigrationSelectionOption-xxxxxx
displayName:
comment:
properties:
condition:
optionName:
steps:
AES 128 GCM State Encryption
State encryption that uses AES/GCM with 128-bit keys to encrypt all values stored in the state repository.
secretKey) A random Base64 string with 128 bits (16 bytes) can be generated e.g. using openssl as follows: openssl rand -base64 16
CAUTION: Once the key is set and has been used to encrypt the key must not be changed!. Data encrypted with a different key cannot be recovered.
type: Aes128GcmStateEncryption
id: Aes128GcmStateEncryption-xxxxxx
displayName:
comment:
properties:
secretKey:
AES256 Decryption Ticket Decoder
password) requireAuthenticatedEncryption) If possible this flag should be enabled.
The AES256EncryptionTicketEncoder uses the GCM Mode by default.maxPBKDF2Iterations)
type: AES256DecryptionTicketDecoder
id: AES256DecryptionTicketDecoder-xxxxxx
displayName:
comment:
properties:
maxPBKDF2Iterations: 32000
password:
requireAuthenticatedEncryption: true
AES256 Encryption Ticket Encoder
The key-value pairs are first encoded as described in
password) requireAuthenticatedEncryption) If possible this flag should be enabled.
type: AES256EncryptionTicketEncoder
id: AES256EncryptionTicketEncoder-xxxxxx
displayName:
comment:
properties:
password:
requireAuthenticatedEncryption: true
Age Check Password Policy
Note: This plugin does only check the minimum age of the current password if this information is made available in the user data (latest-password-change-timestamp). Whether this is the case, may depend on the configuration of the underlying user persister.
Note: This check should not be performed if the user is forced to change the password.
minRequiredPasswordAge)
type: PwdPolicyAgeCheck
id: PwdPolicyAgeCheck-xxxxxx
displayName:
comment:
properties:
minRequiredPasswordAge:
Aggregate Report
fileNamePrefix) The prefix "aggregate-" is used if none is defined.
The generated name is -timestamp[.]fileNameSuffix) propertiesAggregator) reportRenderer)
type: AggregateReport
id: AggregateReport-xxxxxx
displayName:
comment:
properties:
fileNamePrefix: aggregate-
fileNameSuffix:
propertiesAggregator:
reportRenderer:
Airlock 2FA Activation Authentication UI
stepId) showAppDeviceActivationLink)
type: Airlock2FAActivationAuthenticationStepUi
id: Airlock2FAActivationAuthenticationStepUi-xxxxxx
displayName:
comment:
properties:
showAppDeviceActivationLink: true
stepId:
Airlock 2FA Activation Authentication UI (with additional Activation)
stepId) showAppDeviceActivationLink)
type: Airlock2FAAdditionalActivationAuthenticationStepUi
id: Airlock2FAAdditionalActivationAuthenticationStepUi-xxxxxx
displayName:
comment:
properties:
showAppDeviceActivationLink: true
stepId:
Airlock 2FA Activation Letter Order Step
Step to non-interactively order an activation letter. This step doesn't create the letter, but places an order. It is thus recommended to use 'Airlock 2FA Device Activation Letter Order (Batch)' for the 'Activation Letters' option in the 'Airlock 2FA Token Controller' to create the letters.This step has to be added after an identifying step, e.g. a Password Authentication Step. Further, the user has to have an Airlock 2FA Account.
When this step completes successfully, either a new letter order is created or a letter order is already pending.airlock2FASettings) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2FALetterOrderStep
id: Airlock2FALetterOrderStep-xxxxxx
displayName:
comment:
properties:
airlock2FASettings:
customFailureResponseAttributes:
customResponseAttributes:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Airlock 2FA Activation Letter Order User Event Listener
- an Airlock 2FA account;
- an order for an Airlock 2FA activation letter to register the first Airlock 2FA device. All opened orders will be batch processed by the "Airlock 2FA Activation Letter Order Task" in service container to create the necessary activation letters.
airlock2faSettings) condition)
type: Airlock2FAActivationLetterOrderUserEventListener
id: Airlock2FAActivationLetterOrderUserEventListener-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
condition:
Airlock 2FA Activation Letter Task
Settings to batch process Airlock 2FA activation letter orders. Each order will generate at most one activation letter. No activation letter will be generated for a permanently disabled Airlock 2FA account. Each order will be deleted after being processed.
An Airlock 2FA letter contains a QR code to be scanned and is typically necessary for the registration of the first Airlock 2FA device.
Note that once the letter is generated, Airlock IAM is no longer involved in the activation of a user's device. This implies in particular, that a user who has been locked out after the generation of an activation letter could still use it to successfully register an Airlock 2FA device. Login will of course remain impossible as long the the user is locked out.
airlock2faSettings) userStore) renderer) The following placeholders can be used in the templates
${User Context Data Name}- context data of the user.${activationQRCode}- QR code image for the activation. Image size in document can be adjusted:${activationQRCode,imageSize,width in points,height in points}${expires}- expiring date of the activation. Can be used with extended format (e.g.${expires,date,short})${activationCodeShort}- Short 16-digit activation code as an additional option for the activation.
workingDirectory) If this property is defined, activation letters are not directly generated into the output directory (see other property) but they are generated into this working directory and are then moved into the output directory once they are done.
This helps to solve problems with processes that automatically read the rendered activation letters and therefore might not see the fully rendered result. Make sure that the working directory and the output directory reside in the same file system (otherwise the moving of the generated file will not be atomic).
The directory is either absolute or relative to the JVMs current directory.
outputDirectory) languageContextDataName) enrollmentValidityInSeconds) Note: This value is only used for the validity of the QR code in the enrollment letter and does not affect enrollment self-services.
type: Airlock2FAActivationLetterOrderTask
id: Airlock2FAActivationLetterOrderTask-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
enrollmentValidityInSeconds: 604800
languageContextDataName:
outputDirectory:
renderer:
userStore:
workingDirectory:
Airlock 2FA Activation Step
Step to add a new Airlock 2FA device. This step will generate a QR code (and an Airlock 2FA account if necessary) that needs to be scanned by the device to be added.
Depending on the use-case, this step should be configured as an 'Authentication Flow Step', 'Protected Self-Service Flow Step' or 'User-Self-Registration Flow Step'.
- Migration to Airlock 2FA (Authentication Flow)
- In this case, the user does not yet have any Airlock 2FA device, but already has a different second authentication factor (see Security note) that needs to be migrated to Airlock 2FA. This step needs to be configured as an 'Authentication Flow Step' inside a 'Migration Selection Step'. Upon successful migration, the user will have an Airlock 2FA account and a newly registered Airlock 2FA device that can be used for strong authentication. The user's default authentication method will have been changed to Airlock 2FA.
- Activation of an Airlock 2FA device (Protected Self-Service Flow)
- In this case, the user already has a second authentication factor (see Security note) and needs to activate an Airlock 2FA device. This typically happens when the user already has Airlock 2FA as a second authentication factor and needs to activate an additional device. This step needs to be configured as a 'Protected Self-Service Flow Step'. Upon successful activation, the user will have an Airlock 2FA account and a newly registered Airlock 2FA device that can be used for strong authentication. In contrast to the migration scenario above, the user's default authentication method will remain unchanged.
- Activation of an Airlock 2FA device (User-Self-Registration Flow)
- In this case, the flow step will register a futurae user account with the device, that was used to scan the activation code. It is required to add an 'Airlock 2FA Token Persisting Handler' in the 'User Persisting Step' to persist the linked futurae user account with the IAM user.
In the migration and self-service scenarios, an optional 'Airlock 2FA Device Edit Step' can be configured afterwards, to allow the user to edit the newly registered device, e.g., changing its display name.
Note: This step can only register one device in one flow execution. The flow has to be started multiple times when more devices are needed.
Security note: For migration and self-service flows this step should be restricted to strongly authenticated users. To do so, a 'Pre-Condition Tag' should be used to ensure that the user is strongly authenticated (using at least one of his pre-existing second authentication factors). In particular, this step should not be used for a user authenticated with username and password only. In the password only use-case, the (physical) generation of an 'Airlock 2FA Device Activation Letter' is necessary.
airlock2faSettings) enrollmentTimeoutSeconds) Note: This value is not used when generating activation letters.
provideActivationCodeShort) enableShortLivedOnlineQrCodes) Whether to enable short-lived Online QR Codes. Unlike regular Online QR Codes, these are refreshed regularly, allowing for shorter individual validities.
Shorter validities enhance security, since forwarding a QR code to victims and tricking them to scan the QR code becomes more difficult if the available time window is small.
shortLivedQrCodeValidity) The maximum amount of time in seconds for which an Online QR Code is valid after it is first displayed to the end user (ignoring latency). This duration includes the time defined for the validity overlap. It only limits the time for scanning the QR code, not for the confirmation or approval afterwards.
Security Notice: The validity duration represents the attack window. Choosing a small validity makes attacks more difficult, in cases where an attacker attempts to forward a QR code to a victim for scanning.
This setting is only active if short-lived Online QR Codes are enabled.
shortLivedQrCodeValidityOverlap) Defines the duration in seconds during which the previously displayed QR Code is still valid after being replaced by the next QR code in sequence.
This provides time for pending requests to complete and ensures that a valid QR code is displayed at every moment in time, provided that there are no network or performance issues.
The validity overlap must meet the following criteria:
- It must be smaller than half the overall validity of the QR code.
- It must be larger than the Loginapp UI polling interval (1s) plus the network latency (IAM backend → Loginapp UI plus Mobile Device → Futurae Backend).
Note that the polling interval may differ for custom user interfaces.
This setting is only active if short-lived Online QR Codes are enabled.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2FAActivationStep
id: Airlock2FAActivationStep-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
enableShortLivedOnlineQrCodes: false
enrollmentTimeoutSeconds: 300
interactiveGotoTargets:
onFailureGotos:
preCondition:
provideActivationCodeShort: false
requiresActivation: false
shortLivedQrCodeValidity: 10
shortLivedQrCodeValidityOverlap: 3
skipCondition:
stepId:
tagsOnSuccess:
Airlock 2FA Activation Step (with additional Activation)
Step to add a new Airlock 2FA device. This step will generate a QR code (and an Airlock 2FA account if necessary) that needs to be scanned by the device to be added.
This Step allows device activation during the authentication flow even when the user already has a device. This step is able to add both the first device during a migration or an additional device.
airlock2faSettings) enrollmentTimeoutSeconds) Note: This value is not used when generating activation letters.
provideActivationCodeShort) Note: This feature cannot be used in combination with short-lived Online QR Codes.
enableShortLivedOnlineQrCodes) Whether to enable short-lived Online QR Codes. Unlike regular Online QR Codes, these are refreshed regularly, allowing for shorter individual validities.
Shorter validities enhance security, since forwarding a QR code to victims and tricking them to scan the QR code becomes more difficult if the available time window is small.
shortLivedQrCodeValidity) The maximum amount of time in seconds for which an Online QR Code is valid after it is first displayed to the end user (ignoring latency). This duration includes the time defined for the validity overlap. It only limits the time for scanning the QR code, not for the confirmation or approval afterwards.
Security Notice: The validity duration represents the attack window. Choosing a small validity makes attacks more difficult, in cases where an attacker attempts to forward a QR code to a victim for scanning.
This setting is only active if short-lived Online QR Codes are enabled.
shortLivedQrCodeValidityOverlap) Defines the duration in seconds during which the previously displayed QR Code is still valid after being replaced by the next QR code in sequence.
This provides time for pending requests to complete and ensures that a valid QR code is displayed at every moment in time, provided that there are no network or performance issues.
The validity overlap must meet the following criteria:
- It must be smaller than half the overall validity of the QR code.
- It must be larger than the Loginapp UI polling interval (1s) plus the network latency (IAM backend → Loginapp UI plus Mobile Device → Futurae Backend).
Note that the polling interval may differ for custom user interfaces.
This setting is only active if short-lived Online QR Codes are enabled.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2FAAdditionalActivationStep
id: Airlock2FAAdditionalActivationStep-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
enableShortLivedOnlineQrCodes: false
enrollmentTimeoutSeconds: 300
interactiveGotoTargets:
onFailureGotos:
preCondition:
provideActivationCodeShort: false
requiresActivation: false
shortLivedQrCodeValidity: 10
shortLivedQrCodeValidityOverlap: 3
skipCondition:
stepId:
tagsOnSuccess:
Airlock 2FA Activation Step Self-Registration UI
stepId) showAppDeviceActivationLink)
type: Airlock2FAActivationUserSelfRegStepUi
id: Airlock2FAActivationUserSelfRegStepUi-xxxxxx
displayName:
comment:
properties:
showAppDeviceActivationLink: true
stepId:
Airlock 2FA Activation Step Self-Service UI
stepId) showAppDeviceActivationLink)
type: Airlock2FAActivationSelfServiceStepUi
id: Airlock2FAActivationSelfServiceStepUi-xxxxxx
displayName:
comment:
properties:
showAppDeviceActivationLink: true
stepId:
Airlock 2FA Activation Trusted Session Binding Step
This step also provides a REST endpoint to poll the status of an activation.
airlock2faSettings) authenticationMethodId) Example: a system tracks two passwords per user. Password 1 is used in flow A, password 2 in flow B. These two steps must have distinct 'Authentication Method Ids', e.g. PASSWORD1 and PASSWORD2.
If only one identifier (e.g. "PASSWORD") is used, this may allow brute force attacks on the password as follows. Assuming an attacker knows the user's password 1, they get an unlimited number of attempts on flow B, as the 'PASSWORD' counter can repeatedly be reset to 0 by performing a successful login on flow A.To prevent such attacks, use two different counters by setting the authentication methods, for example, to PASSWORD1 and PASSWORD2, respectively.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2faActivationTrustedSessionBindingStep
id: Airlock2faActivationTrustedSessionBindingStep-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
authenticationMethodId: AIRLOCK_2FA
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Airlock 2FA Apply Device Deletion Change
airlock2FASettings)
type: Airlock2FAApplyDeviceDeletionChange
id: Airlock2FAApplyDeviceDeletionChange-xxxxxx
displayName:
comment:
properties:
airlock2FASettings:
Airlock 2FA Apply Device Edit Change
airlock2FASettings)
type: Airlock2FAApplyDeviceEditChange
id: Airlock2FAApplyDeviceEditChange-xxxxxx
displayName:
comment:
properties:
airlock2FASettings:
Airlock 2FA Approval UI (Protected Self-service)
stepId) showAppApprovalLink)
type: Airlock2FASelfServiceApprovalStepUi
id: Airlock2FASelfServiceApprovalStepUi-xxxxxx
displayName:
comment:
properties:
showAppApprovalLink: true
stepId:
Airlock 2FA Approval UI (Public Self-service)
stepId) showAppApprovalLink)
type: Airlock2FAPublicSelfServiceApprovalStepUi
id: Airlock2FAPublicSelfServiceApprovalStepUi-xxxxxx
displayName:
comment:
properties:
showAppApprovalLink: true
stepId:
Airlock 2FA Authentication Data Map
Provides Airlock 2FA authentication information regarding the Auth Token ID device, as well as cooldown information of the authentication device.
The provided Auth Token ID information concerns the device from the Auth Token ID and is available as soon as the user has used or activated an Airlock 2FA device as a second factor for authentication in this session. Currently, the following values are provided:
- a2fa-auth-token-device-id: This key provides the device ID of the Airlock 2FA device.
- a2fa-auth-token-device-type: This key provides the device type of the Airlock 2FA device. It can have the following values:
- ios
- android
- hardware
- a2fa-auth-token-device-display-name: This key provides the display name of the Airlock 2FA device.
- a2fa-auth-token-device-enrollment-timestamp: Timestamp (as date-time object) of the point in time when the Airlock 2FA device was enrolled. This value can be used by template-based providers to format the timestamp into a specific date format.
The cooldown information concerns the device that was used for authentication and is available as soon as the user has successfully used an Airlock 2FA device for authentication in this session. Unlike the Auth Token ID, which is also updated after registering a new device, the values provided here only concern the device used for the actual authentication. Currently, the following values are provided:
- a2fa-cooldown-auth-device: This key reports whether or not the Airlock 2FA device used during authentication is in cooldown. This key can have the following values:
- cooldown: the device is in cooldown
- active: the device is fully active
- a2fa-cooldown-ends: Timestamp (as date-time object) of the point in time when cooldown will end for the Airlock 2FA device that was used during authentication. If the Airlock 2FA device used for authentication is active (not in cooldown), this key is not supplied. This value can be used by template-based providers to format the timestamp into a specific date format.
The following key is always provided and reports what type of devices the user has in the account:
- a2fa-cooldown-devices: This key can have the following values:
- has_active: at least one active Airlock 2FA device is available
- all_cooldown: only Airlock 2FA devices in cooldown are available
- none: no Airlock 2FA devices are available
airlock2faSettings)
type: Airlock2FAAuthenticationDataValueMapProvider
id: Airlock2FAAuthenticationDataValueMapProvider-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
Airlock 2FA Authentication Step
The identifier of the authentication method for this step is 'AIRLOCK_2FA' and is also the identifier for failed authentication attempts.
Note that for mobile-only authentication scenarios, the other authentication plugin "Airlock 2FA Mobile Only Authentication Step" should be used.
factors) Priority list of all enabled factors. Only factors that are in this list can be used for authentication. The factors are offered in the configured order.
Online factors (One-Touch and Online QR Code) must come before all other factors. It is recommended to include at least one offline factor.
Available factors:
- One-Touch: a push message is sent to the user's mobile app, where it must be approved. This is an online factor and will require device selection if the user has multiple devices.
- Online QR Code: a QR code is displayed in the browser, which has to be scanned by a mobile app and approved there. This is an online factor. No prior device selection is required.
- Passcode: the device (mobile app or hardware token) generates a time-dependent code (OTP) that has to be entered manually in the browser. This is an offline factor. No prior device selection is required.
- Offline QR Code: a QR code is displayed in the browser which has to be scanned by a mobile app or hardware token. The device displays a code (OTP) that must be entered manually in the browser. This is an offline factor and will require device selection if the user has multiple devices.
maxFailedPasscodeCheckAttempts) enforceDeviceSelection) enablePushToAll) If Push-to-All is enabled for One-Touch, device selection is never required for One-Touch. Push notifications are sent to all of a user's devices and authentication can be approved on any of the devices.
The combination of Push-to-All and "Cooldown Period" can result in push notifications being sent to devices that are currently still in cooldown. However, those devices can not be used for successfully completing the authentication.
The combination of Push-to-All and "Lock User on Fraud" could have undesired effects, because users might report fraud in legitimate use-cases.
messageProvider) Creates the message that will be displayed on the user's device when using One-Touch. If no message provider is configured, only a title with the fixed translation key "airlock2fa.one-touch.authentication-title" or its fallback value "Login" is used.
Using a custom Message Provider could prevent authentication with a smartwatch: Because additional information is included, the app forces the user to scroll through the message (which might not be supported by the watch).
qrCodeMessageProvider) Creates the message that will be displayed on the user's device when using Online QR Code or Offline QR Code factors. If no message provider is configured, the default title of Futurae will be shown (without any additional information items).
Note that the Login ID cannot be included because it is only available in the One-Touch Message Provider.
Also, because of technical limitations, the title of Offline QR Codes is always the default title from Futurae, the configuration is ignored.
enableShortLivedOnlineQrCodes) Whether to enable short-lived Online QR Codes. Unlike regular Online QR Codes, these are refreshed regularly, allowing for shorter individual validities.
Shorter validities enhance security, since forwarding a QR code to victims and tricking them to scan the QR code becomes more difficult if the available time window is small.
shortLivedQrCodeValidity) The maximum amount of time in seconds for which an Online QR Code is valid after it is first displayed to the end user (ignoring latency). This duration includes the time defined for the validity overlap. It only limits the time for scanning the QR code, not for the confirmation or approval afterwards.
Security Notice: The validity duration represents the attack window. Choosing a small validity makes attacks more difficult, in cases where an attacker attempts to forward a QR code to a victim for scanning.
This setting is only active if short-lived Online QR Codes are enabled.
shortLivedQrCodeValidityOverlap) Defines the duration in seconds during which the previously displayed QR Code is still valid after being replaced by the next QR code in sequence.
This provides time for pending requests to complete and ensures that a valid QR code is displayed at every moment in time, provided that there are no network or performance issues.
The validity overlap must meet the following criteria:
- It must be smaller than half the overall validity of the QR code.
- It must be larger than the Loginapp UI polling interval (1s) plus the network latency (IAM backend → Loginapp UI plus Mobile Device → Futurae Backend).
Note that the polling interval may differ for custom user interfaces.
This setting is only active if short-lived Online QR Codes are enabled.
shortLivedSessionTimeout) Maximum duration in seconds during which short-lived Online QR Codes are displayed until a session timeout occurs.
This setting is used exclusively for short-lived Online QR Codes. It has no effect if short-lived Online QR Codes are disabled.
generateLoginId) If enabled, a random ID is generated and shown to the user during One-Touch authentication.
The ID is generated according to the pattern configured below.
The ID is shown on the Airlock 2FA device and on the login page, allowing the user to correlate the session.
The "One-Touch Message Provider" property must be configured for the Login ID to be displayed on the device. The message provider can use the Login ID by configuring a dedicated value provider.
If the multi-numbered challenge feature is enabled on the Futurae service, "Generate One-Touch Login ID" should be disabled. In that case, the Login ID does not provide any security enhancement but severely impacts usability.
loginIdPattern) Pattern syntax:
pattern = fix_part | random_part [fix_part | random_part]*
random_part = {alphabet_name:number_of_characters}
fix_part = any_string_without_'{'
The alphabet_name refers either to a built-in alphabet (see below) or to a custom alphabet defined in the separate Alphabets property below.
Examples:
{digits:6} → 482913
OTP-{digits:4} → OTP-4821
{HEX:8} (with HEX defined in the custom Alphabets property below) → A9F03C1B
Built-in and ready-to-use alphabets are:
- "
digits" all decimal digits (i.e. the characters 0123456790) - "
lower26" standard alphabet with 26 lowercase letters (i.e. the characters abcdefghijklmnopqrstuvwxyz) - "
upper26" standard alphabet with 26 uppercase letters (i.e. the characters ABCDEFGHIJKLMNOPQRSTUVWXYZ) - "
alpha52" standard alphabet with 26 upper- and 26 lowercase letters (i.e. the characters ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz) - "
distinct" distinct standard characters: digits, upper- and lowercase letter without the hard to distinguish '0,O,1,l,I' (i.e. the characters 23456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ) - "
DISTINCT" distinct standard characters (with uppercase letters): digits and uppercase letter without the hard to distinguish '0,O,1,I' (i.e. the characters 23456789ABCDEFGHJKLMNPQRSTUVWXYZ) - "
extended" contains most of the characters visible on a computer keyboard without the hard to distinguish '0,O,1,l,I' (i.e. the characters +-.,:;$<>()[]{}%&!?/*@#=_23456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ)
NOTE: Characters in this pattern do not pass the input filter for tokens (OTP, SMS, and alike). Choose a different pattern for tokens or relax the corresponding pattern (in the Loginapp's security settings). Characters may be blocked by a WAF deny rule.
Using custom alphabets:
1. Define an alphabet in the Alphabets property below.
2. Reference it in the pattern using {alphabet_name:number_of_characters} where the is the key of the alphabet in the Alphabets property.
NOTE: A pattern that results in a very long Login ID may negatively impact usability. It may also cause issues when generating the push message, as push messages are limited in length. To avoid rejection by Futurae during authentication, do not use special characters (e.g. from the 'extended' alphabet).
loginIdAlphabets) How it works:
The map key defines the alphabet_name:number_of_characters.
The plugin (alphabet) defines the characters used for sampling during random generation.
The alphabet can then be referenced in the Pattern property above using {alphabet_name:number_of_characters}.
Example configuration:
Key (alphabet_name): HEX
Plugin: Alphabet with the following characters 0123456789ABCDEF
Example usage in the Pattern property above:
{HEX:8} → A9F03C1B
OTP-{HEX:6} → OTP-4F9A2C
tagsOnSuccessfulOneTouch) tagsOnSuccessfulOnlineQrCode) tagsOnSuccessfulPasscodeCheck) tagsOnSuccessfulOfflineQrCode) tagsOnSuccessfulBypass) airlock2faSettings) respectCooldownPeriod) If enabled, devices in cooldown cannot be used for authentication.
If disabled, the step ignores the "Cooldown Period" for new devices configured in the "Airlock 2FA Settings". This is typically used for authentication steps that protect low-risk applications, such as a portal page, which can also be accessed using devices in cooldown.
If no "Cooldown Period" is defined, enabling this property has no effect.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2FAUserFactorAuthenticationStep
id: Airlock2FAUserFactorAuthenticationStep-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
enablePushToAll: false
enableShortLivedOnlineQrCodes: false
enforceDeviceSelection: false
factors: [One-Touch, Passcode, Offline QR Code]
generateLoginId: true
interactiveGotoTargets:
loginIdAlphabets:
loginIdPattern: {digits:6}
maxFailedPasscodeCheckAttempts: 3
messageProvider:
onFailureGotos:
preCondition:
qrCodeMessageProvider:
requiresActivation: false
respectCooldownPeriod: true
shortLivedQrCodeValidity: 10
shortLivedQrCodeValidityOverlap: 3
shortLivedSessionTimeout: 60
skipCondition:
stepId:
tagsOnSuccess:
tagsOnSuccessfulBypass:
tagsOnSuccessfulOfflineQrCode:
tagsOnSuccessfulOneTouch:
tagsOnSuccessfulOnlineQrCode:
tagsOnSuccessfulPasscodeCheck:
Airlock 2FA Authentication UI
stepId) showAppApprovalLink)
type: Airlock2FAUserFactorAuthenticationStepUi
id: Airlock2FAUserFactorAuthenticationStepUi-xxxxxx
displayName:
comment:
properties:
showAppApprovalLink: true
stepId:
Airlock 2FA Authenticator
Customize the string resource airlock2fa.one-touch.authentication-title to define the text that is displayed after the word "Approve" for One-Touch authentications.
airlock2faSettings) factors) Priority list of all enabled factors. Only factors that are in this list can be used for authentication. The factors are offered in the configured order.
Online factors (One-Touch and Online QR Code) must come before all other factors. It is recommended to include at least one offline factor.
Available factors:
- One-Touch: a push message is sent to the user's mobile app, where it must be approved. This is an online factor and will require device selection if the user has multiple devices.
- Passcode: the device (mobile app or hardware token) generates a time-dependent code (OTP) that has to be entered manually. This is an offline factor. No prior device selection is required.
- Offline QR Code: a QR code is returned which has to be scanned by a mobile app or hardware token. The device displays a code (OTP) that must be entered manually. This is an offline factor and will require device selection if the user has multiple devices.
If this plugin is configured in a 'Radius Authentication Service', the only two valid configurations here are: 1) One-Touch followed by Passcode or 2) One-Touch.
userPersister) stringResourcesFile) strings, the language dependent files must be strings_de.properties, strings_en.properties and so on and the default file must be strings.properties.
type: Airlock2FAAuthenticator
id: Airlock2FAAuthenticator-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
factors: [One-Touch, Passcode, Offline QR Code]
stringResourcesFile: strings
userPersister:
Airlock 2FA Consistency User Change Listener
- on user deletion: delete associated Airlock 2FA account.
- on user name change: updates the user reference for the Airlock 2FA account.
airlock2FASettings)
type: Airlock2FAConsistencyUserChangeListener
id: Airlock2FAConsistencyUserChangeListener-xxxxxx
displayName:
comment:
properties:
airlock2FASettings:
Airlock 2FA Database Repository
sqlDataSource) storageEncryptionConfig) logQueries) tenantId) If no value is configured, then 'no_tenant' is used as value on the database.
type: Airlock2FARepository
id: Airlock2FARepository-xxxxxx
displayName:
comment:
properties:
logQueries: false
sqlDataSource:
storageEncryptionConfig:
tenantId:
Airlock 2FA Delete Devices Step
Common use cases which can be achieved with this step are:
- Remove all Airlock 2FA devices.
- Remove all Airlock 2FA devices except previously activated devices in this flow.
- Remove all Airlock 2FA devices except the last registered device.
- Remove the Airlock 2FA device which was used for login unless it is the last device.
airlock2FASettings) devicesToDelete) In case no device ID is provided, the step succeeds without deleting any devices.
skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2FADeleteDevicesStep
id: Airlock2FADeleteDevicesStep-xxxxxx
displayName:
comment:
properties:
airlock2FASettings:
customFailureResponseAttributes:
customResponseAttributes:
devicesToDelete:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Airlock 2FA Device Activated
type: Airlock2FADeviceActivatedSubscribedEvent
id: Airlock2FADeviceActivatedSubscribedEvent-xxxxxx
displayName:
comment:
properties:
Airlock 2FA Device Deleted
type: Airlock2FADeviceDeletedSubscribedEvent
id: Airlock2FADeviceDeletedSubscribedEvent-xxxxxx
displayName:
comment:
properties:
Airlock 2FA Device Deletion Initiation Step
airlock2FASettings) canUserDeleteAllDevices) Deprecated: this property will be removed in the next major version of Airlock IAM. Instead, configure the plugin "Airlock 2FA Device Deletion Possible" as an Access Condition inside the protected self-service flow where this step is configured. This ensures that a user has sufficiently many Airlock 2FA app devices before entering the flow.
After this flag is removed, this step will act as if this flag is enabled, which means that it will potentially delete the last device of a user.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2FASelfServiceDeviceDeleteInitiationStep
id: Airlock2FASelfServiceDeviceDeleteInitiationStep-xxxxxx
displayName:
comment:
properties:
airlock2FASettings:
canUserDeleteAllDevices: false
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Airlock 2FA Device Deletion Possible
airlock2faSettings) canUserDeleteAllDevices)
type: Airlock2FADeviceDeletionPossibleCondition
id: Airlock2FADeviceDeletionPossibleCondition-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
canUserDeleteAllDevices: false
Airlock 2FA Device Edit Initiation Step
airlock2FASettings) enforceUniqueDisplayNames) interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2FASelfServiceDeviceEditInitiationStep
id: Airlock2FASelfServiceDeviceEditInitiationStep-xxxxxx
displayName:
comment:
properties:
airlock2FASettings:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
enforceUniqueDisplayNames: true
interactiveGotoTargets:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Airlock 2FA Device Edit Step
Step to edit a newly added Airlock 2FA device.
This step can be used after an 'Airlock 2FA Activation Step' to, for example, change the display name of the new device. See the documentation of 'Airlock 2FA Activation Step' to know in which cases this step should be configured as an 'Authentication Flow Step' or as a 'Protected Self-Service Flow Step'.
Note that this step can not be used to edit already activated Airlock 2FA devices (which were not activated by an 'Airlock 2FA Activation Step' in the same session). For this use-case, a 'Protected Self-Service Flow' with an 'Airlock 2FA Device Edit Initiation Step' and a corresponding 'Apply Changes Step' should be used.
airlock2faSettings) enforceUniqueDisplayNames) interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2FADeviceEditStep
id: Airlock2FADeviceEditStep-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
enforceUniqueDisplayNames: true
interactiveGotoTargets:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Airlock 2FA Device In Cooldown Used
type: Airlock2FADeviceInCooldownUsedSubscribedEvent
id: Airlock2FADeviceInCooldownUsedSubscribedEvent-xxxxxx
displayName:
comment:
properties:
Airlock 2FA Device List
airlock2FASettings) accessCondition) Precondition that must be fulfilled for a user to access the Airlock 2FA device list.
Note the difference to the "Authorization Condition":- Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
authorizationCondition) - Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
type: Airlock2FADeviceListSelfServiceRest
id: Airlock2FADeviceListSelfServiceRest-xxxxxx
displayName:
comment:
properties:
accessCondition:
airlock2FASettings:
authorizationCondition:
Airlock 2FA Device Management UI
Depending on the configuration, the user interface allows an authenticated user:
- to delete an Airlock 2FA device;
- to change the display name of an Airlock 2FA device;
- to activate a new Airlock 2FA device.
The device management interface is accessible at /<loginapp-uri>/ui/app/protected/tokens/airlock-2fa/devices after user authentication.
flowToDeleteDevice) flowToChangeDisplayName) flowToActivateAppDevice) pageExitTarget) If configured, an additional button is displayed on the Airlock 2FA device management to exit the page. On click, this button redirects the user to the configured target.
To redirect to a target application, redirect to the corresponding "Authentication Flow". If the flow can be skipped due to the obtained tags, the user is directly forwarded to the target application.
type: Airlock2FADeviceManagementUi
id: Airlock2FADeviceManagementUi-xxxxxx
displayName:
comment:
properties:
flowToActivateAppDevice:
flowToChangeDisplayName:
flowToDeleteDevice:
pageExitTarget:
Airlock 2FA Device Management UI Redirect
type: Airlock2FADeviceManagementFlowRedirectTarget
id: Airlock2FADeviceManagementFlowRedirectTarget-xxxxxx
displayName:
comment:
properties:
Airlock 2FA Information Item
keyTranslationKey) valueTranslationKey) omitIfValueEmpty) maxKeyLength) maxValueLength)
type: Airlock2FAInformationItem
id: Airlock2FAInformationItem-xxxxxx
displayName:
comment:
properties:
keyTranslationKey:
maxKeyLength: 100
maxValueLength: 100
omitIfValueEmpty: false
valueTranslationKey:
Airlock 2FA Login ID Parameter
Provides the "loginId" parameter that is used to correlate the authentication in the Loginapp with the approval on the 2FA device. The Login ID is displayed if One-Touch is used and "Generate One-Touch Login ID" is set in the Airlock 2FA Authentication Step
This value is only available while the current flow is in the Airlock 2FA Authentication Step
type: Airlock2FALoginIdValueMapProvider
id: Airlock2FALoginIdValueMapProvider-xxxxxx
displayName:
comment:
properties:
Airlock 2FA Message Provider
titleTranslationKey) This key identifies the message template that is used to generate the message title. The title is displayed in the Airlock 2FA mobile app after the word "Approve", e.g. "Login" or "Password Reset".
It is displayed for One-Touch, Online QR Code and Usernameless QR Code factors.
It is ignored for Offline QR Code. Because of technical limitations, the title of Offline QR Codes is always the default title from Futurae.
The string resource key itself may also contain variables, e.g. 'airlock2fa.message.${type}.title'. Variables are replaced with the corresponding values provided by the "Value Providers". For more information about formatting, consult the customer documentation.
informationItems) These information items are displayed for One-Touch, Online QR Code, Offline QR Code and Usernameless QR Code factors.
valueProviders)
type: GenericAirlock2FAMessageProvider
id: GenericAirlock2FAMessageProvider-xxxxxx
displayName:
comment:
properties:
informationItems:
titleTranslationKey:
valueProviders:
Airlock 2FA Mobile Only Authentication Step
This step allows an app on an enrolled mobile device to authenticate with Airlock 2FA by using the Loginapp REST API. The authentication is either performed by switching from the main app to a dedicated authentication app (Airlock 2FA, Futurae or compatible) or directly within an app that has an integrated SDK.
There is no UI for this step.
The identifier of the authentication method for this step is 'AIRLOCK_2FA' and is also the identifier for failed authentication attempts.
redirectUri) schemeOverride) airlock2faSettings) respectCooldownPeriod) If enabled, devices in cooldown cannot be used for authentication.
If disabled, the step ignores the "Cooldown Period" for new devices configured in the "Airlock 2FA Settings". This is typically used for authentication steps that protect low-risk applications, such as a portal page, which can also be accessed using devices in cooldown.
If no "Cooldown Period" is defined, enabling this property has no effect.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2FAMobileOnlyAuthenticationStep
id: Airlock2FAMobileOnlyAuthenticationStep-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
onFailureGotos:
preCondition:
redirectUri:
requiresActivation: false
respectCooldownPeriod: true
schemeOverride:
skipCondition:
stepId:
tagsOnSuccess:
Airlock 2FA Public Self-Service Approval Step
This step allows using Airlock 2FA to approve operations in public self-service flows.
Note that unlike identity verification steps, approval steps require an existing user and cannot prevent username enumeration (no stealth mode). It is therefore important that approval steps are only used after an identity verification step.
messageProvider) enablePushToAll) The combination of Push-to-All and "Lock User on Fraud" could have undesired effects, because users might report fraud in legitimate use-cases.
enableShortLivedOnlineQrCodes) Whether to enable short-lived Online QR Codes. Unlike regular Online QR Codes, these are refreshed regularly, allowing for shorter individual validities.
Shorter validities enhance security, since forwarding a QR code to victims and tricking them to scan the QR code becomes more difficult if the available time window is small.
Note that this approval step should always be used after a verification step so that error response delays are not active. With response delays being active, QR codes are displayed delayed as well, which reduces their effective validity.
shortLivedQrCodeValidity) The maximum amount of time in seconds for which an Online QR Code is valid after it is first displayed to the end user (ignoring latency). This duration includes the time defined for the validity overlap. It only limits the time for scanning the QR code, not for the confirmation or approval afterwards.
Security Notice: The validity duration represents the attack window. Choosing a small validity makes attacks more difficult, in cases where an attacker attempts to forward a QR code to a victim for scanning.
This setting is only active if short-lived Online QR Codes are enabled.
shortLivedQrCodeValidityOverlap) Defines the duration in seconds during which the previously displayed QR Code is still valid after being replaced by the next QR code in sequence.
This provides time for pending requests to complete and ensures that a valid QR code is displayed at every moment in time, provided that there are no network or performance issues.
The validity overlap must meet the following criteria:
- It must be smaller than half the overall validity of the QR code.
- It must be larger than the Loginapp UI polling interval (1s) plus the network latency (IAM backend → Loginapp UI plus Mobile Device → Futurae Backend).
Note that the polling interval may differ for custom user interfaces.
This setting is only active if short-lived Online QR Codes are enabled.
shortLivedSessionTimeout) Maximum duration in seconds during which short-lived Online QR Codes are displayed until a session timeout occurs.
This setting is used exclusively for short-lived Online QR Codes. It has no effect if short-lived Online QR Codes are disabled.
airlock2faSettings) mobileOnlyRedirectUri) mobileOnlySchemeOverride) approvalFactors) Priority list of all factors that can be used in this approval step. Only factors that are in this list can be used. The factors are offered in the configured order.
One-Touch and Online QR Code must come before all other factors. It is recommended to include at least one offline factor.
Available factors:
- One-Touch: a push message is sent to the user's mobile app, where it must be approved. This is an online factor and will require device selection if the user has multiple devices.
- Online QR Code: a QR code is displayed in the browser, which has to be scanned by a mobile app and approved there. This is an online factor. No prior device selection is required.
- Offline QR Code: a QR code is displayed in the browser which has to be scanned by a mobile app or hardware token. The device displays a code (OTP) that must be entered manually in the browser. This is an offline factor and will require device selection if the user has multiple devices.
- Passcode: the device (mobile app or hardware token) generates a time-dependent code (OTP) that has to be entered manually. This is an offline factor. No prior device selection is required.
- Mobile Only: the approval is handled directly by the mobile app. This is an online factor. No prior device selection is required. There is no fallback from this factor to other factors or vice-versa. Therefore, the only use case for combining this with other factors is in transaction approval, where the factor previously used for authentication determines whether mobile-only or another factor will be used. Since there is no way to use any factors configured after Mobile Only, it should always be configured as the last factor.
AuthTokenId:
The AuthTokenId identifies the device and factor that was used during the authentication and links it to the approval process. It is used to ensure that, for certain flows, the same device must perform the approval. The AuthTokenId is evaluated only for transaction approval. It has no effect on other flow types.
When the AuthTokenId is present in the transaction approval flow and contains the factor Mobile Only:
- and the Mobile Only factor is configured in this approval step: the Mobile Only factor will be enforced.
- and the Mobile Only factor is not configured in this approval step: any of the configured factors may be used.
respectCooldownPeriod) If enabled, devices in cooldown cannot be used for approval.
If disabled, this step ignores the "Cooldown Period" for new devices configured in the "Airlock 2FA Settings". This is typically used for approval steps that protect low-risk operations, which can also be performed with devices in cooldown.
If no "Cooldown Period" is defined, enabling this property has no effect.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2FAPublicSelfServiceApprovalStep
id: Airlock2FAPublicSelfServiceApprovalStep-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
approvalFactors: [One-Touch, Offline QR Code, Mobile Only]
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
enablePushToAll: false
enableShortLivedOnlineQrCodes: false
interactiveGotoTargets:
messageProvider:
mobileOnlyRedirectUri:
mobileOnlySchemeOverride:
onFailureGotos:
preCondition:
requiresActivation: false
respectCooldownPeriod: true
shortLivedQrCodeValidity: 10
shortLivedQrCodeValidityOverlap: 3
shortLivedSessionTimeout: 60
skipCondition:
stepId:
tagsOnSuccess:
Airlock 2FA Recovery Trusted Session Binding Step
This step can be used to recover previously enrolled Airlock 2FA accounts on a fresh installation of a mobile app. This refers to mobile apps which integrate the Futurae SDK and can therefore be enrolled as a device for an Airlock 2FA account. An enrollment of an Airlock 2FA account on a mobile app is subsequently referred to as a (virtual) device. One physical device can host multiple virtual devices. If 'Trusted Session Binding for Recovery' is enabled in the 'Airlock 2FA Settings', this step is necessary for users to recover their devices.
Airlock IAM does not provide a UI for this step, since it exposes a REST API which is intended to be used by custom mobile apps.
The following describes the recovery use case which is enabled by this step:
- A fresh installation of a mobile app extracts the device identifiers of a previous installation from a backup.
- A user authenticates with Airlock IAM (via the mobile app).
- This is where the 'Airlock 2FA Recovery Trusted Session Binding Step' has to be active in the IAM flow. The step can be completed successfully with the following actions:
- The mobile app sends the device identifiers Airlock IAM.
- Airlock IAM checks whether one of the devices to be recovered belongs to the authenticated user and aborts the flow otherwise.
- Airlock IAM requests a Trusted Session Binding token from Futurae and returns it to the mobile app. If Airlock IAM does not receive a flow binding token from Futurae, it will return an empty response and the step will continue as if the retrieval was successful.
- The mobile app forwards the Trusted Session Binding token to the Futurae SDK to complete the recovery.
- The mobile app polls Airlock IAM for the status of the recovery.
- After successful recovery, all users who had devices on the previous installation will have new devices and the ones from the previous installation cannot be used anymore.
airlock2faSettings) authenticationMethodId) Example: a system tracks two passwords per user. Password 1 is used in flow A, password 2 in flow B. These two steps must have distinct 'Authentication Method Ids', e.g. PASSWORD1 and PASSWORD2.
If only one identifier (e.g. "PASSWORD") is used, this may allow brute force attacks on the password as follows. Assuming an attacker knows the user's password 1, they get an unlimited number of attempts on flow B, as the 'PASSWORD' counter can repeatedly be reset to 0 by performing a successful login on flow A.To prevent such attacks, use two different counters by setting the authentication methods, for example, to PASSWORD1 and PASSWORD2, respectively.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2faRecoveryTrustedSessionBindingStep
id: Airlock2faRecoveryTrustedSessionBindingStep-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
authenticationMethodId: AIRLOCK_2FA
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Airlock 2FA Self-Service Approval Step
This step allows using Airlock 2FA to approve operations in protected self-services flows, such as user data changes or registrations of additional devices. Typically, this step is configured between the step where a change is initiated and the step where the change is persisted.
messageProvider) enablePushToAll) The combination of Push-to-All and "Lock User on Fraud" could have undesired effects, because users might report fraud in legitimate use-cases.
enableShortLivedOnlineQrCodes) Whether to enable short-lived Online QR Codes. Unlike regular Online QR Codes, these are refreshed regularly, allowing for shorter individual validities.
Shorter validities enhance security, since forwarding a QR code to victims and tricking them to scan the QR code becomes more difficult if the available time window is small.
shortLivedQrCodeValidity) The maximum amount of time in seconds for which an Online QR Code is valid after it is first displayed to the end user (ignoring latency). This duration includes the time defined for the validity overlap. It only limits the time for scanning the QR code, not for the confirmation or approval afterwards.
Security Notice: The validity duration represents the attack window. Choosing a small validity makes attacks more difficult, in cases where an attacker attempts to forward a QR code to a victim for scanning.
This setting is only active if short-lived Online QR Codes are enabled.
shortLivedQrCodeValidityOverlap) Defines the duration in seconds during which the previously displayed QR Code is still valid after being replaced by the next QR code in sequence.
This provides time for pending requests to complete and ensures that a valid QR code is displayed at every moment in time, provided that there are no network or performance issues.
The validity overlap must meet the following criteria:
- It must be smaller than half the overall validity of the QR code.
- It must be larger than the Loginapp UI polling interval (1s) plus the network latency (IAM backend → Loginapp UI plus Mobile Device → Futurae Backend).
Note that the polling interval may differ for custom user interfaces.
This setting is only active if short-lived Online QR Codes are enabled.
shortLivedSessionTimeout) Maximum duration in seconds during which short-lived Online QR Codes are displayed until a session timeout occurs.
This setting is used exclusively for short-lived Online QR Codes. It has no effect if short-lived Online QR Codes are disabled.
airlock2faSettings) mobileOnlyRedirectUri) mobileOnlySchemeOverride) approvalFactors) Priority list of all factors that can be used in this approval step. Only factors that are in this list can be used. The factors are offered in the configured order.
One-Touch and Online QR Code must come before all other factors. It is recommended to include at least one offline factor.
Available factors:
- One-Touch: a push message is sent to the user's mobile app, where it must be approved. This is an online factor and will require device selection if the user has multiple devices.
- Online QR Code: a QR code is displayed in the browser, which has to be scanned by a mobile app and approved there. This is an online factor. No prior device selection is required.
- Offline QR Code: a QR code is displayed in the browser which has to be scanned by a mobile app or hardware token. The device displays a code (OTP) that must be entered manually in the browser. This is an offline factor and will require device selection if the user has multiple devices.
- Passcode: the device (mobile app or hardware token) generates a time-dependent code (OTP) that has to be entered manually. This is an offline factor. No prior device selection is required.
- Mobile Only: the approval is handled directly by the mobile app. This is an online factor. No prior device selection is required. There is no fallback from this factor to other factors or vice-versa. Therefore, the only use case for combining this with other factors is in transaction approval, where the factor previously used for authentication determines whether mobile-only or another factor will be used. Since there is no way to use any factors configured after Mobile Only, it should always be configured as the last factor.
AuthTokenId:
The AuthTokenId identifies the device and factor that was used during the authentication and links it to the approval process. It is used to ensure that, for certain flows, the same device must perform the approval. The AuthTokenId is evaluated only for transaction approval. It has no effect on other flow types.
When the AuthTokenId is present in the transaction approval flow and contains the factor Mobile Only:
- and the Mobile Only factor is configured in this approval step: the Mobile Only factor will be enforced.
- and the Mobile Only factor is not configured in this approval step: any of the configured factors may be used.
respectCooldownPeriod) If enabled, devices in cooldown cannot be used for approval.
If disabled, this step ignores the "Cooldown Period" for new devices configured in the "Airlock 2FA Settings". This is typically used for approval steps that protect low-risk operations, which can also be performed with devices in cooldown.
If no "Cooldown Period" is defined, enabling this property has no effect.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2FASelfServiceApprovalStep
id: Airlock2FASelfServiceApprovalStep-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
approvalFactors: [One-Touch, Offline QR Code, Mobile Only]
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
enablePushToAll: false
enableShortLivedOnlineQrCodes: false
interactiveGotoTargets:
messageProvider:
mobileOnlyRedirectUri:
mobileOnlySchemeOverride:
onFailureGotos:
preCondition:
requiresActivation: false
respectCooldownPeriod: true
shortLivedQrCodeValidity: 10
shortLivedQrCodeValidityOverlap: 3
shortLivedSessionTimeout: 60
skipCondition:
stepId:
tagsOnSuccess:
Airlock 2FA Settings
repository) futuraeServer) accountDisplayNameProvider) Privacy warning: The display name, when configured, will be stored on Futurae's servers. Sensitive data should therefore not be used as display name.
trustedSessionBindingForActivation) If enabled, activation codes (from a letter or on-screen QR code) can only be used as part of an authenticated session with Airlock IAM. If enabled, activation codes are only accepted together with a "Trusted Session Binding Token". This short-lived token can only be retrieved from an Airlock IAM flow and must be sent to the Futurae server together with the activation code.
This feature ensures that only the intended user can activate a 2FA app/device with a given activation code. The standard Airlock 2FA app does not support this feature, a custom mobile app built using the Futurae SDK is required.
Airlock IAM supports three modes for Trusted Session Binding:
- Never: Trusted Session Binding is disabled.
- Only with Letter: Trusted Session Binding is only enabled for activation letters.
- Always: Trusted Session Binding is enabled both for activation letters and on-screen activation. For on-screen activation, Trusted Session Binding does not provide additional security because the activation code is already bound to an authenticated IAM session, but it could simplify the implementation of the activation process in the mobile app.
trustedSessionBindingForRecovery) trustedSessionBindingValidity) - Trusted Session Binding for Activation is set to "Only with Letter" or "Always".
- Trusted Session Binding for Recovery is enabled.
The duration should not be larger than the "Session Idle Timeout" in the Loginapp, to avoid session timeouts when polling the IAM status.
lockUserOnFraud) LockReason.FraudReportedByUser when reporting a possible fraudulent authentication attempt via the Airlock 2FA app. This is done by rejecting the authentication attempt and then confirming that the attempt was not initiated by the user (in the app dialog).
Self-unlock is possible when locked by this option.
allowFuturaeBypassMode) If enabled, Futurae users that have the bypass mode enabled will be allowed to authenticate / perform approval with IAM. Otherwise, any authentication or approval attempts for users with the bypass mode enabled will result in a failure.
Warning: Enabling bypass mode effectively disables all Airlock 2FA second factor checks. Bypass mode should not be used in production environments.
payloadEncryptionKey) The encryption of payloads in requests to the Futurae API prevents that intermediate infrastructure such as a reverse proxy is able to read or alter the confidential data therein. The encryption key can be obtained from the Futurae Admin Dashboard.
unencryptedPayloadForHWTokens) - If the option is enabled, the payload is transmitted in plain text (unencrypted).
- If the option is disabled, hardware tokens will not be available for authentication or approval via Offline QR Code, since Futurae does not support payload encryption for hardware tokens.
Note: Enabling this property without configuring a 'Payload Encryption Key' has no effect, as the payload is transmitted unencrypted by default.
cooldownPeriod) If configured, a cooldown period is enabled during which a newly registered device cannot be used for certain operations.
By default, all Airlock 2FA steps are configured so that devices may not be used during the "Cooldown Period". Exceptions can be configured directly on the step by de-activating the "Respect Cooldown Period" property.
The duration must be specified in the format "2d 4h 10m 5s" (any part can be omitted).
type: Airlock2FASettings
id: Airlock2FASettings-xxxxxx
displayName:
comment:
properties:
accountDisplayNameProvider:
allowFuturaeBypassMode: false
cooldownPeriod:
futuraeServer:
lockUserOnFraud: false
payloadEncryptionKey:
repository:
trustedSessionBindingForActivation: OFF
trustedSessionBindingForRecovery: false
trustedSessionBindingValidity: 120
unencryptedPayloadForHWTokens: false
Airlock 2FA Token Controller
id) Unique identifier for the token controller. Serves as token type ID in the REST interface.
This is also the "auth method" that is set on the user as active/next authentication method, i.e. it must match the "Authentication Method ID" of corresponding authentication flow steps.
Finally, this ID also determines the name (label) of this token controller in the Adminapp UI, as defined by the resource key 'user.auth-methods.type.generic.<id>', as well as the label for "auth method" specific lock reasons defined by the resource key 'user.account-state.LockReason.TooManyAuthAtts.<id>'.
Please note that the length of this ID must not be longer than 22 characters in order to comply with the default DB schema restrictions for column lock_reason.airlock2faSettings) createActivationLetters) orderActivationLetters) createShipmentLetters) shareHardwareTokensAmongUsers) Once a hardware token is assigned to a user, it is only available within the corresponding Futurae service.
type: Airlock2FATokenController
id: Airlock2FATokenController-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
createActivationLetters:
createShipmentLetters:
id: AIRLOCK_2FA
orderActivationLetters:
shareHardwareTokensAmongUsers: false
Airlock 2FA Token Insertion Handler
Persists an Airlock 2FA account that was created through a previous step.
Note: The Airlock 2FA Account Display Name can only be set when the registering user is persisted. Therefore the Account Display Name in the Airlock 2FA mobile app might not be displayed correctly, until the registration is fully completed.
airlock2faSettings)
type: Airlock2FAInsertionHandler
id: Airlock2FAInsertionHandler-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
Airlock 2FA Transaction Approval Step
The transaction data will be displayed on the Airlock 2FA app, where the user can verify the data and approve the transaction if satisfied.
messageProvider) enablePushToAll) The combination of Push-to-All and "Lock User on Fraud" could have undesired effects, because users might report fraud in legitimate use-cases.
If an AuthTokenId is provided, notifications are only sent to the device specified in the AuthTokenId.
enableShortLivedOnlineQrCodes) Whether to enable short-lived Online QR Codes. Unlike regular Online QR Codes, these are refreshed regularly, allowing for shorter individual validities.
Shorter validities enhance security, since forwarding a QR code to victims and tricking them to scan the QR code becomes more difficult if the available time window is small.
shortLivedQrCodeValidity) The maximum amount of time in seconds for which an Online QR Code is valid after it is first displayed to the end user (ignoring latency). This duration includes the time defined for the validity overlap. It only limits the time for scanning the QR code, not for the confirmation or approval afterwards.
Security Notice: The validity duration represents the attack window. Choosing a small validity makes attacks more difficult, in cases where an attacker attempts to forward a QR code to a victim for scanning.
This setting is only active if short-lived Online QR Codes are enabled.
shortLivedQrCodeValidityOverlap) Defines the duration in seconds during which the previously displayed QR Code is still valid after being replaced by the next QR code in sequence.
This provides time for pending requests to complete and ensures that a valid QR code is displayed at every moment in time, provided that there are no network or performance issues.
The validity overlap must meet the following criteria:
- It must be smaller than half the overall validity of the QR code.
- It must be larger than the Loginapp UI polling interval (1s) plus the network latency (IAM backend → Loginapp UI plus Mobile Device → Futurae Backend).
Note that the polling interval may differ for custom user interfaces.
This setting is only active if short-lived Online QR Codes are enabled.
shortLivedSessionTimeout) Maximum duration in seconds during which short-lived Online QR Codes are displayed until a session timeout occurs.
This setting is used exclusively for short-lived Online QR Codes. It has no effect if short-lived Online QR Codes are disabled.
airlock2faSettings) mobileOnlyRedirectUri) mobileOnlySchemeOverride) approvalFactors) Priority list of all factors that can be used in this approval step. Only factors that are in this list can be used. The factors are offered in the configured order.
One-Touch and Online QR Code must come before all other factors. It is recommended to include at least one offline factor.
Available factors:
- One-Touch: a push message is sent to the user's mobile app, where it must be approved. This is an online factor and will require device selection if the user has multiple devices.
- Online QR Code: a QR code is displayed in the browser, which has to be scanned by a mobile app and approved there. This is an online factor. No prior device selection is required.
- Offline QR Code: a QR code is displayed in the browser which has to be scanned by a mobile app or hardware token. The device displays a code (OTP) that must be entered manually in the browser. This is an offline factor and will require device selection if the user has multiple devices.
- Passcode: the device (mobile app or hardware token) generates a time-dependent code (OTP) that has to be entered manually. This is an offline factor. No prior device selection is required.
- Mobile Only: the approval is handled directly by the mobile app. This is an online factor. No prior device selection is required. There is no fallback from this factor to other factors or vice-versa. Therefore, the only use case for combining this with other factors is in transaction approval, where the factor previously used for authentication determines whether mobile-only or another factor will be used. Since there is no way to use any factors configured after Mobile Only, it should always be configured as the last factor.
AuthTokenId:
The AuthTokenId identifies the device and factor that was used during the authentication and links it to the approval process. It is used to ensure that, for certain flows, the same device must perform the approval. The AuthTokenId is evaluated only for transaction approval. It has no effect on other flow types.
When the AuthTokenId is present in the transaction approval flow and contains the factor Mobile Only:
- and the Mobile Only factor is configured in this approval step: the Mobile Only factor will be enforced.
- and the Mobile Only factor is not configured in this approval step: any of the configured factors may be used.
respectCooldownPeriod) If enabled, devices in cooldown cannot be used for approval.
If disabled, this step ignores the "Cooldown Period" for new devices configured in the "Airlock 2FA Settings". This is typically used for approval steps that protect low-risk operations, which can also be performed with devices in cooldown.
If no "Cooldown Period" is defined, enabling this property has no effect.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2FATransactionApprovalStep
id: Airlock2FATransactionApprovalStep-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
approvalFactors: [One-Touch, Offline QR Code, Mobile Only]
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
enablePushToAll: false
enableShortLivedOnlineQrCodes: false
interactiveGotoTargets:
messageProvider:
mobileOnlyRedirectUri:
mobileOnlySchemeOverride:
onFailureGotos:
preCondition:
requiresActivation: false
respectCooldownPeriod: true
shortLivedQrCodeValidity: 10
shortLivedQrCodeValidityOverlap: 3
shortLivedSessionTimeout: 60
skipCondition:
stepId:
tagsOnSuccess:
Airlock 2FA Username Transformer
a2faUserRepositoryConfig)
type: Airlock2FAUsernameTransformer
id: Airlock2FAUsernameTransformer-xxxxxx
displayName:
comment:
properties:
a2faUserRepositoryConfig:
Airlock 2FA Usernameless Authentication Step
Step for Airlock 2FA Usernameless QR Code authentication.
This step allows authentication without requiring the user to enter their username. Instead, a QR code (identifying the session) is displayed on the login page and can be scanned by any user with the Airlock 2FA app. The app then authenticates this session on the server and thus enables Airlock IAM to connect the browser session with the user who scanned the QR code.
airlock2faSettings) messageProvider) Creates the message that will be displayed on the user's device when using Usernameless QR Code. If no message provider is configured, the default title of Futurae will be shown (without any additional information items).
Note that since no user ID is known when creating a username-less QR code, no message providers relying on user-specific data can be used.
qrCodeValidity) maxRenewals) QR codes will be renewed already before they expire. This ensures that users can complete ongoing authentication seamlessly even if they scan a QR code shortly before it is refreshed.
Fewer renewals do not lead to enhanced security. The only reason not to renew indefinitely is to save server resources.
timeoutGoto) respectCooldownPeriod) If enabled, devices in cooldown cannot be used for authentication.
If disabled, the step ignores the "Cooldown Period" for new devices configured in the "Airlock 2FA Settings". This is typically used for authentication steps that protect low-risk applications, such as a portal page, which can also be accessed using devices in cooldown.
If no "Cooldown Period" is defined, enabling this property has no effect.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: Airlock2FAUsernamelessQrCodeAuthenticationStep
id: Airlock2FAUsernamelessQrCodeAuthenticationStep-xxxxxx
displayName:
comment:
properties:
airlock2faSettings:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
maxRenewals: 10
messageProvider:
onFailureGotos:
preCondition:
qrCodeValidity: 60
requiresActivation: false
respectCooldownPeriod: true
skipCondition:
stepId:
tagsOnSuccess:
timeoutGoto:
Airlock 2FA was used for login (Transaction Approval only)
selectableIfNoAuthTokenIdPresent)
type: Airlock2FAAuthTokenIdSelectionCondition
id: Airlock2FAAuthTokenIdSelectionCondition-xxxxxx
displayName:
comment:
properties:
selectableIfNoAuthTokenIdPresent: true
Airlock Gateway Roles
roleProvider) timeoutProvider)
type: AirlockGatewayRoles
id: AirlockGatewayRoles-xxxxxx
displayName:
comment:
properties:
roleProvider:
timeoutProvider:
Airlock Gateway Settings
addCredentialsToSession) ADD_CREDENTIALS. If every identity propagation shall replace all previously set roles, disable this property, which results in the Airlock Control Cookie command SET_CREDENTIALS. controlCookieName) The name of the control cookie used to communicate with the Airlock Gateway (WAF) backend control API. This must be the same as configured in Airlock.
A control cookie is set after successful authentication with the roles granted to the user as credentials/roles. Additionally, a new session ID is generated (to prevent session fixation attacks) and the global session ID is set as audit token.
This property also enables so-called "session tickets". After successful authentication the user's name and the granted roles are stored in the current session plus a session ticket cookie including this information is stored in the Airlock Gateway cookie store. The session ticket is needed to re-authenticate any new session later.
environmentCookiePrefix) auditToken) Type of the audit token set in the Airlock Gateway (WAF) after the authentication.
- "Username": The audit token contains just the username.
- "SessionID": The audit token contains just the session id.
- "Username and SessionID": The audit token contains the username followed by a "-" and the session ID.
- "None": The audit token is empty.
type: AirlockGateway
id: AirlockGateway-xxxxxx
displayName:
comment:
properties:
addCredentialsToSession: true
auditToken: USERNAME
controlCookieName: AL_CONTROL
environmentCookiePrefix: AL_ENV_
Airlock Gateway Settings (Loginapp)
removedRolesMappings) Airlock Gateway can indicate (using an environment cookie) that roles have been dropped. Dropped roles can be mapped to tags in Airlock IAM that should be dropped as a consequence.
clientFingerprintingLockoutThreshold) If the Airlock Gateway terminates a session because of a high client fingerprinting (CFP) score, IAM is informed about this as part of the Airlock Gateway logout propagation.
This property defines a CFP score threshold: If the CFP score reported by the Airlock Gateway is above or equal to the threshold, the user account is locked in IAM. This way not only the current Airlock Gateway session is terminated but also the user account is locked for further login attempts. The user can't unlock his account by using the "Unlock Self-Service".
Note: Ensure that the logout propagation path in the corresponding Airlock Gateway mapping for IAM points to the corresponding REST endpoint.
Please refer to the Airlock Gateway manual for further information about client fingerprinting.
addCredentialsToSession) ADD_CREDENTIALS. If every identity propagation shall replace all previously set roles, disable this property, which results in the Airlock Control Cookie command SET_CREDENTIALS. controlCookieName) The name of the control cookie used to communicate with the Airlock Gateway (WAF) backend control API. This must be the same as configured in Airlock.
A control cookie is set after successful authentication with the roles granted to the user as credentials/roles. Additionally, a new session ID is generated (to prevent session fixation attacks) and the global session ID is set as audit token.
This property also enables so-called "session tickets". After successful authentication the user's name and the granted roles are stored in the current session plus a session ticket cookie including this information is stored in the Airlock Gateway cookie store. The session ticket is needed to re-authenticate any new session later.
environmentCookiePrefix) auditToken) Type of the audit token set in the Airlock Gateway (WAF) after the authentication.
- "Username": The audit token contains just the username.
- "SessionID": The audit token contains just the session id.
- "Username and SessionID": The audit token contains the username followed by a "-" and the session ID.
- "None": The audit token is empty.
type: LoginappGateway
id: LoginappGateway-xxxxxx
displayName:
comment:
properties:
addCredentialsToSession: true
auditToken: USERNAME
clientFingerprintingLockoutThreshold:
controlCookieName: AL_CONTROL
environmentCookiePrefix: AL_ENV_
removedRolesMappings:
Airlock Microgateway Settings
clientIpExtractor) requestIdExtractor) requestUrlExtractor) requestMtlsClientCertExtractor)
type: AirlockMicrogateway
id: AirlockMicrogateway-xxxxxx
displayName:
comment:
properties:
clientIpExtractor:
requestIdExtractor:
requestMtlsClientCertExtractor:
requestUrlExtractor:
Alias User Item
Definition of a user alias. An alias is a special context data item that can be used as a login name in the same way as the username.
Note that by definition, all login names (i.e., aliases and usernames) must be unique across all users.
contextDataName) required) validators) inputPurpose) The input purpose allows labeling data items using standardized values (see https://www.w3.org/TR/WCAG22/#input-purposes).
It is rendered using the HTML attribute "autocomplete". Browsers can use this to automatically fill input fields with data that was previously entered in other fields with the same purpose.
Note that the input purpose provided here will be used in the default Loginapp UI components and is available to custom single-page applications via the REST endpoints */info/retrieve.
If the Loginapp UI is used with configuration-based 'Customized Step UIs', the input purpose has to be defined on the UI elements ('Input UI Element', 'Drop-Down UI Element', 'Date UI Element').
type: AliasDefinition
id: AliasDefinition-xxxxxx
displayName:
comment:
properties:
contextDataName:
inputPurpose:
required: true
validators:
All Devices Except Most Recently Registered
In case no Airlock 2FA account is associated with the current user, no device IDs are returned.
Use case: This plugin can be used to enforce a single-device policy, meaning a user must only be able to use a single device simultaneously. For this, in any flow allowing the user to authenticate with Airlock 2FA, this plugin must be used with an 'Airlock 2FA Delete Devices Step' upfront.
respectCooldownPeriod) If enabled, devices in cooldown are never returned and do not count towards determining the latest registered device.
airlock2FASettings)
type: AllAirlock2FADevicesExceptMostRecentlyRegisteredProvider
id: AllAirlock2FADevicesExceptMostRecentlyRegisteredProvider-xxxxxx
displayName:
comment:
properties:
airlock2FASettings:
respectCooldownPeriod: true
All Devices Except Registered In Flow
In case no Airlock 2FA account is associated with the current user, no device IDs are returned.
Use case: This plugin is designed to facilitate the secure migration of users from the Airlock 2FA app to either an alternative 2FA app or a new business app that includes built-in two-factor authentication using the Futurae Mobile SDK (One App solution). During this migration, all old tokens associated with the user's previous business application are deleted to ensure security and prevent unauthorized access.For this use case, the plugin should be used with an 'Airlock 2FA Delete Devices Step' which is configured after the step activating the new Airlock 2FA device.
respectCooldownPeriod) If enabled, devices in cooldown are never returned.
airlock2FASettings)
type: AllAirlock2FADevicesExceptRegisteredInFlowProvider
id: AllAirlock2FADevicesExceptRegisteredInFlowProvider-xxxxxx
displayName:
comment:
properties:
airlock2FASettings:
respectCooldownPeriod: true
All Ok On Behalf Login Step Validator
type: AllOkOnBehalfLoginStepValidator
id: AllOkOnBehalfLoginStepValidator-xxxxxx
displayName:
comment:
properties:
All Phone Numbers Provider
mtanHandler)
type: AllPhoneNumbersProvider
id: AllPhoneNumbersProvider-xxxxxx
displayName:
comment:
properties:
mtanHandler:
All Required Roles Match
Selects a configuration if the admin has all of the roles required by the configuration. If a configuration requires no roles, it is always selected.
type: AllRequiredRolesMatcher
id: AllRequiredRolesMatcher-xxxxxx
displayName:
comment:
properties:
All User Roles
type: UserRolesProvider
id: UserRolesProvider-xxxxxx
displayName:
comment:
properties:
Allowed Characters Password Policy
allowedCharsPattern) Every character of the password is matched against this pattern and must match or the password is not allowed.
For details about regular expression syntax, please refer to the class description of the Java JDK class java.util.regex.Pattern of the used Java JDK.Because every single character is checked against the expression anchors ('^') and end-of-line chars ('$') don't make sense and can be left out.
type: PwdPolicyAllowedCharsCheck
id: PwdPolicyAllowedCharsCheck-xxxxxx
displayName:
comment:
properties:
allowedCharsPattern:
Allowed Username Password Combination
username) password)
type: AllowedUsernamePasswordCombination
id: AllowedUsernamePasswordCombination-xxxxxx
displayName:
comment:
properties:
password:
username:
Alphabet
characters) NOTE: When used for random string generation, repeating characters will be generated with higher probability. Usually, a uniform distribution of characters is desired. Therefore, repeating characters should be avoided in these use cases.
type: Alphabet
id: Alphabet-xxxxxx
displayName:
comment:
properties:
characters:
Always Down Check
type: AlwaysDownCheck
id: AlwaysDownCheck-xxxxxx
displayName:
comment:
properties:
Always False
type: AlwaysFalseCondition
id: AlwaysFalseCondition-xxxxxx
displayName:
comment:
properties:
Always Revoked Status Checker
type: AlwaysRevokedStatusChecker
id: AlwaysRevokedStatusChecker-xxxxxx
displayName:
comment:
properties:
Always True
type: AlwaysTrueCondition
id: AlwaysTrueCondition-xxxxxx
displayName:
comment:
properties:
Always True Representation Authorization
type: AlwaysTrueRepresentationAuthorization
id: AlwaysTrueRepresentationAuthorization-xxxxxx
displayName:
comment:
properties:
And Claim Condition
conditions)
type: AndClaimCondition
id: AndClaimCondition-xxxxxx
displayName:
comment:
properties:
conditions:
Anomaly Shield State Risk Extractor
expectedAnomalyStates) tagsIfOneOfExpectedAnomalyStates) tagsIfNoneOfExpectedAnomalyStates)
type: AnomalyShieldStateRiskExtractor
id: AnomalyShieldStateRiskExtractor-xxxxxx
displayName:
comment:
properties:
expectedAnomalyStates: [anomalous]
tagsIfNoneOfExpectedAnomalyStates:
tagsIfOneOfExpectedAnomalyStates:
Any Required Role Matches
Selects a configuration if the admin has any of the roles required by the configuration.
type: AnyRequiredRoleMatcher
id: AnyRequiredRoleMatcher-xxxxxx
displayName:
comment:
properties:
API Policy Service
This web application currently offers a REST endpoint targeted at Airlock WAF that allows to retrieve information about a technical client by resolving a given API key. Among other, the returned information contains details about the technical client and associated plans (including rate limits).
repository) sharedSecret) Shared secret to verify the JWT signature. Must be the same as on the Airlock Gateway (WAF) using this API Policy Service endpoint.
The shared secret must be encoded in base64. The minimal required unencoded length is at least 512 bits. Configuration validation fails if the secret is too short.
One can, for example, generate a random secret with 512 bits (64 bytes) as base64 encoded string using openssl as follows: openssl rand -base64 96
contextExtractor) logUserTrailToDatabase) Configures the database settings to use when persisting user trail log entries.
If this value is defined, then all user trail log messages generated by the API Policy Service App module will additionally be forwarded to the database configured within the referenced repository plugin.
All forwarded log entries are stored inside the table "USER_TRAIL_LOG". Note that setting this value does not disable writing log messages to the API Policy Service log file.
correlationIdSettings) Defines settings for correlation ID transfer and logging inside the Api Policy Service module.
If undefined, no correlation ID will be logged for this module.
type: ApiPolicyServiceApp
id: ApiPolicyServiceApp-xxxxxx
displayName:
comment:
properties:
contextExtractor:
correlationIdSettings:
logUserTrailToDatabase:
repository:
sharedSecret:
App Device Used For Login Unless Last App Device
This provider returns nothing in case the login device is the only App device of the user or the login device is not an App device, e.g. Hardware device.
In case no Airlock 2FA account is associated with the current user, no device IDs are returned.
Note: This plugin should only be used in authentication and protected self-service flows since the other flows do not contain information on the last device used for login.
Use case: This plugin is designed to facilitate the secure migration of users from the Airlock 2FA app to either an alternative 2FA app or a new business app that includes built-in two-factor authentication using the Futurae Mobile SDK (One App solution). In contrast to the 'All Devices Except Registered In Flow' plugin, this plugin does not delete all old tokens during a migration but only the one used in this session. This is beneficial when a user has multiple devices, and you want to avoid unintended deletions that could disrupt access from other devices. For this use case, the plugin should be used with an 'Airlock 2FA Delete Devices Step' which is configured after the step activating the new Airlock 2FA device.
respectCooldownPeriod) If enabled, devices in cooldown are never returned. Consequently, if the login device is in cooldown or if there is only one device which is not in cooldown, no devices are returned.
airlock2FASettings)
type: Airlock2FALoginDeviceUnlessLastDeviceIdProvider
id: Airlock2FALoginDeviceUnlessLastDeviceIdProvider-xxxxxx
displayName:
comment:
properties:
airlock2FASettings:
respectCooldownPeriod: false
Application ID
Configuration of the Application ID.
In the SPA, this property defines the access path of the respective application. For example:
/<loginapp-uri>/ui/app/auth/application/access/<APP_ID>
applicationId)
type: ApplicationId
id: ApplicationId-xxxxxx
displayName:
comment:
properties:
applicationId:
Application Portal Group
identifier) - protected.application-portal.group.${identifier}.title for the group title
- protected.application-portal.group.${identifier}.description for the description text of the group
portalTargets)
type: ApplicationPortalGroup
id: ApplicationPortalGroup-xxxxxx
displayName:
comment:
properties:
identifier:
portalTargets:
Application Portal Target
identifier) - protected.application-portal.group.${group-identifier}.target.${identifier}.title for the portal target on the portal page
redirectTarget) redirectByAccess) This functionality is not needed for Protected Self-Services, where access control is already provided by the "Access Condition" and "Authorization Condition".
precondition) openInNewTab)
type: ApplicationPortalTarget
id: ApplicationPortalTarget-xxxxxx
displayName:
comment:
properties:
identifier:
openInNewTab: false
precondition:
redirectByAccess: true
redirectTarget:
Application Portal UI
The portal is accessible at /<loginapp-uri>/ui/app/protected/portal after user authentication.
portalGroups) autoForward)
type: ApplicationPortalUi
id: ApplicationPortalUi-xxxxxx
displayName:
comment:
properties:
autoForward: false
portalGroups:
Apply Account Link Deletion
type: ApplyAccountLinkDeletion
id: ApplyAccountLinkDeletion-xxxxxx
displayName:
comment:
properties:
Apply Account Link Linking
type: ApplyAccountLinkLinking
id: ApplyAccountLinkLinking-xxxxxx
displayName:
comment:
properties:
Apply Changes Step
handlers) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: ApplyChangesStep
id: ApplyChangesStep-xxxxxx
displayName:
comment:
properties:
customFailureResponseAttributes:
customResponseAttributes:
handlers:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Apply Cronto Device Deletion
crontoHandler)
type: ApplyCrontoDeviceDeletion
id: ApplyCrontoDeviceDeletion-xxxxxx
displayName:
comment:
properties:
crontoHandler:
Apply Cronto Device Disabling
crontoHandler)
type: ApplyCrontoDeviceDisabling
id: ApplyCrontoDeviceDisabling-xxxxxx
displayName:
comment:
properties:
crontoHandler:
Apply Cronto Device Enabling
crontoHandler)
type: ApplyCrontoDeviceEnabling
id: ApplyCrontoDeviceEnabling-xxxxxx
displayName:
comment:
properties:
crontoHandler:
Apply Cronto Device Renaming
crontoHandler)
type: ApplyCrontoDeviceRenaming
id: ApplyCrontoDeviceRenaming-xxxxxx
displayName:
comment:
properties:
crontoHandler:
Apply Cronto Push Disabling
crontoHandler)
type: ApplyCrontoPushDisabling
id: ApplyCrontoPushDisabling-xxxxxx
displayName:
comment:
properties:
crontoHandler:
Apply Cronto Push Enabling
crontoHandler)
type: ApplyCrontoPushEnabling
id: ApplyCrontoPushEnabling-xxxxxx
displayName:
comment:
properties:
crontoHandler:
Apply Device Token Registration
Note that only the last registered device token will be persisted.
deviceTokenSettings)
type: ApplyDeviceTokenRegistration
id: ApplyDeviceTokenRegistration-xxxxxx
displayName:
comment:
properties:
deviceTokenSettings:
Apply Email Change
contextDataName)
type: ApplyEmailChange
id: ApplyEmailChange-xxxxxx
displayName:
comment:
properties:
contextDataName:
Apply FIDO Credential Deletion
fidoSettings)
type: ApplyFidoCredentialDeletion
id: ApplyFidoCredentialDeletion-xxxxxx
displayName:
comment:
properties:
fidoSettings:
Apply FIDO Credential Disabling
fidoSettings)
type: ApplyFidoCredentialDisabling
id: ApplyFidoCredentialDisabling-xxxxxx
displayName:
comment:
properties:
fidoSettings:
Apply FIDO Credential Display Name Change
fidoSettings)
type: ApplyFidoCredentialDisplayNameChange
id: ApplyFidoCredentialDisplayNameChange-xxxxxx
displayName:
comment:
properties:
fidoSettings:
Apply FIDO Credential Enabling
fidoSettings)
type: ApplyFidoCredentialEnabling
id: ApplyFidoCredentialEnabling-xxxxxx
displayName:
comment:
properties:
fidoSettings:
Apply mTAN Deletion
mtanSettings)
type: ApplyMtanDeletion
id: ApplyMtanDeletion-xxxxxx
displayName:
comment:
properties:
mtanSettings:
Apply mTAN Edit Change
mtanSettings)
type: ApplyMtanEditChange
id: ApplyMtanEditChange-xxxxxx
displayName:
comment:
properties:
mtanSettings:
Apply mTAN Registration Change
mtanSettings)
type: ApplyMtanRegistrationChange
id: ApplyMtanRegistrationChange-xxxxxx
displayName:
comment:
properties:
mtanSettings:
Apply OAuth 2.0 Consent Deny
type: ApplyOAuth2DenyConsent
id: ApplyOAuth2DenyConsent-xxxxxx
displayName:
comment:
properties:
Apply OAuth 2.0 Consent Grant
type: ApplyOAuth2GrantConsent
id: ApplyOAuth2GrantConsent-xxxxxx
displayName:
comment:
properties:
Apply OAuth 2.0 Consents Deletion
type: ApplyOAuth2DeleteConsents
id: ApplyOAuth2DeleteConsents-xxxxxx
displayName:
comment:
properties:
Apply OAuth 2.0 Session Deletion
type: OAuth2DeleteSessionApply
id: OAuth2DeleteSessionApply-xxxxxx
displayName:
comment:
properties:
Apply Remember-Me Device Deletion
rememberMeConfig)
type: ApplyRememberMeDeviceDeletion
id: ApplyRememberMeDeviceDeletion-xxxxxx
displayName:
comment:
properties:
rememberMeConfig:
Apply User Data Edit Change
type: ApplyUserDataEditChange
id: ApplyUserDataEditChange-xxxxxx
displayName:
comment:
properties:
Argon2id Password Hash
The configuration allows you to adjust the parameters of the algorithm (m, t, and p). Correctly tuning these parameters is crucial to ensuring strong security and reasonable performance on the target hardware.
Benchmark tests should be performed with this plugin on the actual hardware of the production system to determine the highest possible parameters while ensuring a good user experience (e.g., acceptable authentication times). See also Performance tuning and scaling best practices in the documentation.
The default configuration settings are based on the latest OWASP security recommendations and do not take specific hardware characteristics into account.
All three parameters (m, t, and p) are stored with the password hash and used to check passwords. Changing the values does not break existing password hashes. The salt length is 16 bytes, and the hash (tag) length is 32 bytes. However, since the hash parameters are stored as well, an Argon2id hash is longer than a Scrypt hash, which may affect the number of hashes in a "History Password Hash" plugin.
The persisted hash is stored as a PHC-formatted string.
memorySizeKb) iterations) parallelism)
type: Argon2idPasswordHash
id: Argon2idPasswordHash-xxxxxx
displayName:
comment:
properties:
iterations: 2
memorySizeKb: 19456
parallelism: 1
ASP SMS Gateway
This plug-in uses the XML/HTTP(S) interface of ASPSMS to send SMS messages.
accountUsername) accountPassword) serviceUri) See note in plug-in description when using SSL (HTTPS instead of HTTP).
Use the plugin FailoverSmsGateway to use multiple ASPSMS URLs for increased availability.
proxyHost) proxyPort) proxyLoginUser) proxyLoginPassword) allowOnlyTrustedCerts) Only allow connections to servers whose certificate is trusted. See documentation of property "Trust Store Path" for more information about what certificates are trusted.
Security warning: Trusting all certificates allows connections to adversarial hosts. Only disable this property for testing and integration setups.
verifyServerHostname) Enables hostname verification, i.e. the actual hostname must be the same as in the server certificate.
Security warning: Not verifying the hostname may allow connections to adversarial hosts, e.g. if they employ DNS spoofing. Only disable this property for testing and integration setups.
trustStorePath) If this property is not defined the following certificate issuers are trusted:
- The list of issuers known to the Java VM if the system property "javax.net.ssl.trustStore" is not defined.
- The list of issuers in a keystore referenced by system property "javax.net.ssl.trustStore" if defined in instance.properties using iam.java.opts
If this property is defined then the following certificate issuers are trusted:
- The list of issuers in the referenced truststore file and no others.
This property is only relevant if the property "Allow Only Trusted Certs" is enabled.
trustStoreType) trustStorePassword) Depending on the keystore type, leaving this property empty (or undefined) has a different effect:
- JKS: the keystore can be opened and used but the integrity of the keystore is not checked.
- PKCS12: an error occurs.
connectTimeout) correlationIdHeaderName) When configured, all requests sent contain a header with the correlation ID with the configured name. If no value or an empty value is specified, the correlation ID header is not sent.
If the correlation ID is not defined, the correlation ID header is not included in sent requests.
visiblePhoneNumberDigitsInLog) Defines the number of phone number digits visible in log statements.
Thus, if the value is zero, all digits are masked, if it is large enough, all digits are visible. If set to 3, for example, the logged number looks like ********965.
The default is 100, i.e. showing all digits.
type: AspSmsGateway
id: AspSmsGateway-xxxxxx
displayName:
comment:
properties:
accountPassword:
accountUsername:
allowOnlyTrustedCerts: true
connectTimeout: 10
correlationIdHeaderName:
proxyHost:
proxyLoginPassword:
proxyLoginUser:
proxyPort:
serviceUri:
trustStorePassword:
trustStorePath:
trustStoreType: JKS
verifyServerHostname: true
visiblePhoneNumberDigitsInLog: 100
Assertion Attribute
name) value-property or static-value property. One of valueor static-value must be set, but not both at the same time. value) - The value
@usernamerefers to the user's name. - The value
@rolesrefers to the user's roles. - The value
@info:keyrefers to the element of the additional input data with the given key. - The value
@param:keyrefers to the element of the parameter map with the given key. - Any other value is retrieved from the user's context data container.
valueTransformations) staticValue)
type: AssertionAttribute
id: AssertionAttribute-xxxxxx
displayName:
comment:
properties:
name:
staticValue:
value:
valueTransformations:
Audience From Request Parameter (OAuth 2.0 Token Exchange)
If the request does not contain an "audience" parameter or if the request's "audience" parameter is an empty array, the claim value will not be set (unless when the claim is required, for example for the "aud" target claim).
If the request contains one "audience" parameter, the claim value will be set to a single string value. If the request contains multiple "audience" parameters, the claim value will be set to an array.
type: OAuth2TokenExchangeJwtAudienceRequestParameterClaimValue
id: OAuth2TokenExchangeJwtAudienceRequestParameterClaimValue-xxxxxx
displayName:
comment:
properties:
Audience From Subject Token (OAuth 2.0 Token Exchange)
Sets the claim value to that of the subject token's "aud" claim value.
If present, the subject token's "aud" data is parsed as either a single string audience value or an array of string audience values as per RFC7519. If the subject token's "aud" data is present but does not conform with the specification, the token exchange request will lead to an invalid request error.
If the subject token's "aud" data is single-valued after removing non-allowed values (i.e. it is either a string or an array with a single element after removing the values not matching any of the configured patterns) and conforms with the specification, the claim value will be set to a string. If the subject token's "aud" data is multi-valued and conforms with the specification, the claim value will be set to an array.
If the subject token's "aud" data is not present, is an empty array or none of the values match the configured filters, the claim value will not be set.
valueFilters) An optional list of regular expressions. If the list is configured, only values in in the subject token's "aud" data matching at least one of the regular expressions will be added. Values that do not match any of the configured regular expressions will be ignored. If the list is not configured, all the values in the subject token's "aud" claim will be added.
type: OAuth2TokenExchangeJwtSubjectTokenAudienceClaimValue
id: OAuth2TokenExchangeJwtSubjectTokenAudienceClaimValue-xxxxxx
displayName:
comment:
properties:
valueFilters:
Audit Token SAML 2.0 Attribute
samlAttributeName) nameFormat)
type: AuditTokenAttribute
id: AuditTokenAttribute-xxxxxx
displayName:
comment:
properties:
nameFormat: urn:oasis:names:tc:SAML:2.0:attrname-format:basic
samlAttributeName:
Auth Method-based Authenticator Selector
Authenticator plugin that selects one of several configured authenticators depending on the user's active authentication method.
Note: This plugin does not check the status of the user account (locked, invalid) and does not update login statistics (failed logins, etc.). It can therefore only be used in conjunction with another authenticator (e.g. Main Authenticator or Meta Authenticator).
mappings) defaultAuthenticator) userPersister)
type: AuthMethodBasedAuthenticatorSelector
id: AuthMethodBasedAuthenticatorSelector-xxxxxx
displayName:
comment:
properties:
defaultAuthenticator:
mappings:
userPersister:
Auth Token ID SAML 2.0 Attribute
samlAttributeName) nameFormat)
type: AuthTokenIdAttribute
id: AuthTokenIdAttribute-xxxxxx
displayName:
comment:
properties:
nameFormat: urn:oasis:names:tc:SAML:2.0:attrname-format:basic
samlAttributeName:
Authenticated Client ID (OAuth 2.0 Token Exchange)
Sets the act claim to a claim set containing the authenticated client ID as sub claim and nests the original act claim from the subject token data into this claim set.
Nesting the act claim within another expresses a chain of delegation. The outermost act claim represents the current actor while nested act claims represent prior actors. The least recent actor is the most deeply nested. The nested act claims serve as a history trail that connects the initial request and subject through the various delegation steps undertaken before reaching the current actor.
If the subject token data has no act claim, the new claim only contains the sub claim.
type: OAuth2TokenExchangeAuthenticatedClientIdActorClaim
id: OAuth2TokenExchangeAuthenticatedClientIdActorClaim-xxxxxx
displayName:
comment:
properties:
Authentication & Authorization UI
targetApplicationId) customizedStepUis) languageExtractor) The Language Extractor is a Location Interpreter which allows the UI to extract the language from the forward location. It is added to the value map from the location interpretation endpoint (/<loginapp-uri>/rest/public/authentication/location/interpret/) with the key IAM_UI_LANGUAGE.
The IAM UI uses this endpoint, when application access with a forward location is requested. For this, an "Application Selector" must be configured on the "Target Application" configuration for the respective authentication flow. Otherwise, this setting has no effect for the default IAM UI.
showGotoButtons) Show Goto buttons for all configured Goto targets on all pages using default UIs of this flow. Clicking a Goto button will redirect to the corresponding Goto target. The Goto targets are configured in the flows themselves, not the UIs.
For customized step UIs, Goto buttons have to be configured explicitly using the "Goto Button UI Element" plugin.
Notice: Goto buttons do not come with pre-defined labels. It is required to add i18n keys and values for each button manually. The key may looks as follows: 'authentication.pages.actions.goto.<currentStepId>.<targetStepId>'.
maintenanceMessageUiSettings) selfUnlockFlow) targetURIResolver) - The resolved URL must either be absolute (i.e. using https://) or start with a slash.
- It may be necessary to configure 'Identity Propagation' to make the authentication work.
- Uses the custom 'X-Forward-URL' header to inform the SPA about the target. Do not set the same header again in the identity propagation of the respective authentication flow.
- Note: this setting is irrelevant for SAML 2.0 target applications (a target application where the "SAML 2.0 Identity Propagator" is configured). For such an application, simply configure a resolver with "/" as default value.
cancellationTarget) For customized step UIs, cancel buttons have to be configured explicitly using the "Cancel Button UI Element" plugin.
flowFailureTarget) showCancelButtonOnFirstPage) Note that even if this flag is disabled, a cancel button on the first page is always shown when the first page is reached again during the flow, e.g. by a Goto.
type: AuthenticationUi
id: AuthenticationUi-xxxxxx
displayName:
comment:
properties:
cancellationTarget:
customizedStepUis:
flowFailureTarget:
languageExtractor:
maintenanceMessageUiSettings:
selfUnlockFlow:
showCancelButtonOnFirstPage: false
showGotoButtons: true
targetApplicationId:
targetURIResolver:
Authentication & Authorization UIs
flowUis) nonFlowUiSettings) onLogout) ssoParameterNames)
type: AuthenticationUiConfigs
id: AuthenticationUiConfigs-xxxxxx
displayName:
comment:
properties:
flowUis:
nonFlowUiSettings:
onLogout:
ssoParameterNames: [sso]
Authentication Data Map
Provides some data about the successful authentication of the user.
Currently, the following values are provided:
- auth-token-id: Auth Token ID (available as soon as the user has used a second factor for authentication in this session).
- authentication-timestamp: timestamp (as date object) of the successful authentication (available as soon as the user has successfully authenticated for the first time in this session). Can be used by template-based providers to format the timestamp into a specific date format.
- authentication-timestamp-millis: timestamp (as number of milliseconds since epoch) of the successful authentication (available as soon as the user has successfully authenticated for the first time in this session).
type: AuthenticationDataValueMapProvider
id: AuthenticationDataValueMapProvider-xxxxxx
displayName:
comment:
properties:
Authentication Flow
steps) processors) The configured processors are extended with the following processors (if not already present):
- User Enumeration Protection Processor (only if "Prevent User Enumeration" enabled)
- Temporary Locking Processor (only if "Enable Temporary Locking" enabled)
preventUserEnumeration) If enabled, user enumeration is prevented by not revealing what went wrong in a user identifying step ("Stealth Mode"). In particular, all failures because of wrong password or not existing, locked or invalid user are answered with the same generic error code AUTHENTICATION_FAILED. Furthermore, the sessions of the user will be terminated on IAM and on the Airlock Gateway (WAF).
Note that this feature is not compatible with Temporary Locking. It is recommended to configure a "Fixed Response Duration" for failed responses to prevent user enumeration timing attacks.
Important note: This feature only protects against user enumeration if the identifying step identifies the user and at the same time checks a credential, e.g. in case of "Password Authentication" or "Device Token Authentication". If the "User Identifying Step" is used, this feature does not protect against user enumeration.
If enabled, a "User Enumeration Protection Processor" is automatically added to the list of flow processors.
temporaryLockingActive) Enables Temporary Locking for this flow.
Note: This is only effective, if temporary locking is also enabled in the "Target Applications and Authentication" plugin.
If enabled, a "Temporary Locking Processor" is automatically added to the list of flow processors.
Note: Disabling and re-enabling this feature does not reset temporary locks.
addRemainingAttemptsInfo) If enabled, for any step result that caused an increase in the number of failed attempts, the remaining number of attempts for that factor is returned with the step result.
This feature is not combinable with username enumeration protection.
usernameTransformers) The transformation of a username takes place in the first step before the user is loaded. Note that username transformers have no effect on the propagated username value. Transformers can be chained, i.e. a first transformer could normalize the original name, where the next transformer looks up the normalized name in a database for potential transformation matches.
In contrary to the above description of chaining, a transformer can also signal that it already found the final user ID and the chain must stop after it.
For further details please refer to the documentation of the username transformer plugins.
additionalAttributes) Whitelist of additional attributes (e.g. headers or REST attributes) for the check password authentication REST call (/<loginapp-uri>/rest/public/authentication/password/check/).
Attributes with matching names and valid values are made available to the flow.
persistencyless) If enabled, this flow does not consider persistency, i.e. users don't have to exist locally in order to be authenticated. This is typically used with SSO tickets or external authentication using OAuth or SAML.
Persistency-less flows are very limited in their capabilities, in particular:
- Password checks and second factor authentication are not possible.
- The user state (locked, invalid etc.) cannot be verified.
- Identity propagation is limited to the information received from external systems.
Note that configuration validation support is limited. It is essential to test such a flow extensively to ensure it behaves correctly in all situations.
It is recommended to use the "Default Persistency-less Authentication Processors" when using a persistency-less flow.
type: AuthenticationFlow
id: AuthenticationFlow-xxxxxx
displayName:
comment:
properties:
addRemainingAttemptsInfo: false
additionalAttributes:
persistencyless: false
preventUserEnumeration: false
processors:
steps:
temporaryLockingActive: true
usernameTransformers:
Authentication Flow Successfully Completed
type: AuthenticationFlowSuccessfullyCompletedSubscribedEvent
id: AuthenticationFlowSuccessfullyCompletedSubscribedEvent-xxxxxx
displayName:
comment:
properties:
Authentication Instant SAML 2.0 Attribute
samlAttributeName) dateAndTimeFormat) If this property is set, the SAML 2.0 attribute will contain the authentication instant formatted using the configured date and time format. The format is interpreted as specified in the java.text.SimpleDateFormat documentation. Note that the output time zone is fixed to GMT.
If this property is not set, the attribute value will contain the authentication instant as a Unix timestamp (i.e. milliseconds since epoch).
nameFormat)
type: AuthenticationInstantAttribute
id: AuthenticationInstantAttribute-xxxxxx
displayName:
comment:
properties:
dateAndTimeFormat:
nameFormat: urn:oasis:names:tc:SAML:2.0:attrname-format:basic
samlAttributeName:
Authentication Method Changed
This event is not published in the following cases:
- The authentication method is edited via context data - use a "Context Data Changed" event instead
- The user is newly created
- The user is imported, e.g. via a service container task or from external persistency (AD/LDAP)
ignoreEmptyPreviousMethod) ignoreEmptyActiveMethod)
type: AuthenticationMethodChangedEvent
id: AuthenticationMethodChangedEvent-xxxxxx
displayName:
comment:
properties:
ignoreEmptyActiveMethod: false
ignoreEmptyPreviousMethod: false
Authentication Method Condition
authMethod)
type: AuthMethodEqualsEventCondition
id: AuthMethodEqualsEventCondition-xxxxxx
displayName:
comment:
properties:
authMethod:
Authentication Method Identifier Mapping
authMethodIdentifier) authenticator)
type: AuthMethodBasedAuthenticatorSelectorMapping
id: AuthMethodBasedAuthenticatorSelectorMapping-xxxxxx
displayName:
comment:
properties:
authMethodIdentifier:
authenticator:
Authenticator-based One-Shot Target Application
Defines how to authenticate HTTP requests based on the original HTTP request sent by the client (provided to IAM in various Airlock Gateway environment cookies).
The following actions are applied for each request:
- Credential Extraction: Extract credential from the HTTP request (e.g. a bearer token or a cookie).
- Authentication: Call specified authenticator with credential (e.g. verify JWT ticket).
- Error handling: If authentication failes, the specified error mapper defines how to respond (e.g. send 401 to client).
- Authorization: Assure roles required to access application/services are given after authentication.
- ID-Propagation: provide information about authenticated user to target application/service.
- Set Airlock Gateway (WAF) roles: provide credentials/roles to Airlock Gateway to allow request to pass to target application/service.
credentialExtractorFactory) authenticator) Validates the credential from the credential extractor in order to authenticate the HTTP request.
Note:
- Only non-interactive authentication steps (there is no way to interact with the HTTP client at this point - use the REST authentication API to do so if desired) may be configured.
- The authenticator must know how to handle the credential type provided by the credential extractor.
A common use-case is to verify JWT tokens issued by an upfront authentication process (as "Authorization Bearer" header):
- Extract bearer token from HTTP header (using the "HTTP Header Token Extractor (as SSO Credential)").
- Authenticate the request using the "Lookup and Accept Authenticator" or the "SSO Credential Authenticator".
failureResponses) identityPropagator) enableUserTrailLog) If enabled, a message is logged to the user trail log for every successful or unsuccessful authentication.
Caution: If the Airlock Gateway (WAF) is used in stateless mode, every single request may have to be authenticated by IAM due to missing roles. Hence, every request may generate a message in the user trail log depending on the Airlock Gateway configuration.
urlPattern) The first pattern (in the list of target applications) that matches the forward URL is used.
The matching is case-insensitive.
The URL pattern is ignored for the default target application.
useDifferentUsername) - The name of the context data field in which this username is stored. Note that this field needs to be made persistent via the User Persister.
- A fixed username (which is the same for all users). This should start with FIXED: followed by the username. E.g.: if the username is "admin", set this to "FIXED:admin".
- Leave this empty, if no username is required or the standard username should be used.
The resulting username can be transformed further by using the Username Transformation property.
usernameTransformation) These transformations are applied after the "Use Different Username" property.
useDifferentPassword) - If no password is required for this application: leave empty.
- If the user has (or can have) a different password at this application: The name of the context data field in which this password is to be stored. Remember that this field needs to be made persistent via the User Persister.
- If a fixed password is used that is the same for all users: Prefix with FIXED: followed by the password, e.g. "FIXED:123456".
- If the user's main password (i.e. the password used to login to Airlock IAM) is used: Leave the field empty, but see the notes below.
- The main password can only be used if the user was required to enter the password upon login. This is not the case for Kerbos and other SSO-Logins. In those cases, this option is not possible.
- Normally, the user's password is only available directly after login. If the user comes back to the Loginapp later, e.g. to access a different application, the password is normally not available anymore.
- If only one target application is configured, this should not be a problem, since the user only needs to be authenticated at the very beginning (directly after the authentication).
- If the user's password is needed for several target application, then it is has to be available every time the user wants to access another application in the same session. In this case, the password should be saved in the session ticket (see Security Settings).
passwordEncryptionMethod) Leave empty if the password is not encrypted (not recommended if the password is read from a context data field).
requiredRoles) The user needs at least one of the roles in order to get access to the application.
If no roles are configured, all authenticated users may access the application.
The user's roles may be transformed before being compared to this list using the Role Transformation Rules (see separate property).
If the user doesn't have any of these roles, the "Step-Up Authenticators" (in Authentication Settings) are consulted in order to find out whether they can be obtained using a Step-Up.
airlockGatewayRoles) The Airlock Gateway (WAF) roles that should be set when accessing this target application, instead of using the users roles as Gateway roles.
The name of the role can be followed by a colon and the idle timeout of the role in seconds, e.g. "myrole:300" sets the role "myrole" that will expire after 5 minutes of client inactivity.
With a second colon and a second number, the life-time can be set, e.g. "myrole:300:3600" will set the role "myrole" for a maximum of 1 hour, but it will also expire after 5 minutes of client inactivity.
Note: If you want to replace (instead of add) target application's Gateway roles in the session upon the first visit of each target application, you have to disable the "Add Credentials To Session" flag in the "Airlock Gateway (WAF) Settings" of the Login Application.
roleTransformationRules) propagatedRolesToDelete) propagatedRolesToKeep) propagatedRolesTransformationRules) propagatedRolesToAdd)
type: AuthenticatorBasedOneShotTargetApplication
id: AuthenticatorBasedOneShotTargetApplication-xxxxxx
displayName:
comment:
properties:
airlockGatewayRoles:
authenticator:
credentialExtractorFactory:
enableUserTrailLog: true
failureResponses:
identityPropagator:
passwordEncryptionMethod:
propagatedRolesToAdd:
propagatedRolesToDelete:
propagatedRolesToKeep:
propagatedRolesTransformationRules:
requiredRoles:
roleTransformationRules:
urlPattern:
useDifferentPassword:
useDifferentUsername:
usernameTransformation:
AuthnContextClassRef URI SAML 2.0 Attribute
samlAttributeName) nameFormat)
type: AuthnClassRefAttribute
id: AuthnClassRefAttribute-xxxxxx
displayName:
comment:
properties:
nameFormat: urn:oasis:names:tc:SAML:2.0:attrname-format:basic
samlAttributeName:
Authorization Flow
steps) processors)
type: AuthorizationFlow
id: AuthorizationFlow-xxxxxx
displayName:
comment:
properties:
processors:
steps:
Automated Account Registration
usernameProvider) userContextDataItems) staticRoles) statusUponCreation) - logged-in: the new user will be automatically logged-in.
- locked: the new user will be locked, allowing an administrator to review the registration before unlocking the account. The user will be locked with reason
AwaitingAdminApproval. The string resource key "account-registration-user-locked-message" is used for the corresponding feedback message.
type: AccountRegistration
id: AccountRegistration-xxxxxx
displayName:
comment:
properties:
staticRoles:
statusUponCreation: LOGGED_IN
userContextDataItems:
usernameProvider:
AWS Access Key Authentication
This plugin provides credentials to allow IAM to access AWS services. If configured, no other credentials are considered, such as AWS cloud environment credentials.
accessKeyId) secretAccessKey)
type: AwsAccessKeyAuthentication
id: AwsAccessKeyAuthentication-xxxxxx
displayName:
comment:
properties:
accessKeyId:
secretAccessKey:
AWS Custom Service Access
region) If no explicit AWS region is specified, IAM will attempt to identify the region in the following order:
- Java system property aws.region
- Environment variable AWS_REGION
- Config files at location {user.home}/.aws/credentials and {user.home}/.aws/config
- Region delivered through the Amazon EC2 metadata service
endpointUrl) This property defines the endpoint (URL) of the entry point for an AWS web service.
If left empty, the default endpoint for the selected region is used (refer to the official AWS documentation).
If configured, the default endpoint is overwritten with this URL.
type: AwsCustomServiceAccess
id: AwsCustomServiceAccess-xxxxxx
displayName:
comment:
properties:
endpointUrl:
region:
AWS Default Authentication
- Java system properties aws.accessKeyId and aws.secretAccessKey
- Environment variables AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
- Web Identity Token credentials from system properties or environment variables
- Credential profiles file at location {user.home}/.aws/credentials
- Credentials delivered through the Amazon EC2 container service
- Instance profile credentials delivered through the Amazon EC2 metadata service
type: AwsDefaultAuthentication
id: AwsDefaultAuthentication-xxxxxx
displayName:
comment:
properties:
AWS Default Service Access
This plugin handles how IAM can access AWS service endpoints. It automatically selects the AWS region and thus the default endpoint for each service in that region, e.g. AWS Key Management Service (KMS).
Regions enable you to access AWS services that physically reside in a specific geographic area.
Default access selection is useful when IAM is deployed in an AWS cluster where the region is already provided in one of the formats described below.
IAM attempts to identify the AWS region in the following order:
- Java system property aws.region
- Environment variable AWS_REGION
- Config files at location {user.home}/.aws/credentials and {user.home}/.aws/config
- Region delivered through the Amazon EC2 metadata service
IAM requires a region to connect to the AWS service, otherwise connection fails with an error.
Multiple AWS regions for the same service are currently not supported.
type: AwsDefaultServiceAccess
id: AwsDefaultServiceAccess-xxxxxx
displayName:
comment:
properties:
AWS Key Management Service
AWS KMS provides a web interface to generate and manage cryptographic keys and acts as a cryptographic service provider.
Airlock IAM utilizes AWS KMS to store encrypted data in its database without having access to the cryptographic key material. AWS KMS can also be used for end-to-end encryption.
serviceAccessSettings) If IAM is deployed in an AWS cluster, it is recommended to use "AWS Default Service Access".
If you want to manually configure AWS access (region/service endpoint), use "AWS Custom Service Access" instead.
authenticationSettings) If IAM is deployed in an AWS cluster, it is recommended to use "AWS Default Authentication".
If you want to manually configure AWS authentication (access key ID and secret), use "AWS Access Key Authentication" instead.
symmetricKeyArn) This key is created in AWS and referenced here by its Amazon Resource Name (ARN). Key ARN and alias ARN are supported.
When automatic key rotation is active on AWS KMS, or if you intend to manually rotate keys, you must specify an alias ARN in this property.
asymmetricKeyArn) This key is created in AWS and referenced here by its Amazon Resource Name (ARN). Key ARN and alias ARN are supported.
Since the lifetime of the public key is long, it is possible to save one AWS KMS round trip by downloading the public key and configuring it in "RSA Public Key". Make sure "RSA Asymmetric Key ARN" and "RSA Public Key" always point to the same asymmetric key material.
publicKey) The public key can be downloaded from AWS directly and referenced here. A Base64 encoded key with or without RSA public key wrapping "BEGIN PUBLIC KEY"/"END PUBLIC KEY" is expected. This is an optimization so that the public key is taken from this property instead of requesting it by its "RSA Asymmetric Key ARN" from AWS for every operation.
rsaAlgorithm) The algorithm must be compatible with the KMS key referenced by "RSA Asymmetric Key ARN".
type: AwsKms
id: AwsKms-xxxxxx
displayName:
comment:
properties:
asymmetricKeyArn:
authenticationSettings:
publicKey:
rsaAlgorithm: RSAES_OAEP_SHA_256
serviceAccessSettings:
symmetricKeyArn:
AWS KMS Password Decryption
- Asymmetric key to encrypt the randomly generated key which encrypts a users password on client side. Configure this ARN in "RSA Asymmetric Key ARN".
- Symmetric key to encrypt the password hashes that are stored on Airlock IAM's database. Configure this ARN in "Symmetric Key ARN".
awsKmsSettings)
type: AwsKmsPasswordDecryption
id: AwsKmsPasswordDecryption-xxxxxx
displayName:
comment:
properties:
awsKmsSettings:
AWS KMS Password Hash
Password hash for AWS Key Management Service (KMS).
The password is first hashed with the defined hash function and then encrypted by AWS KMS.
This plugin does no encoding on the resulting hash. Therefore it should be used in combination with a 'Password Hash Configuration' or 'History Password Hash'.
If a password history is required, wrap this plugin in a 'History Password Hash'. However, bear in mind that an encrypted hash can be longer than the hash value itself. This affects the number of possible entries of 'Max History Length' in 'History Password Hash'.
hashFunction) awsKmsSettings)
type: AwsKmsPasswordHash
id: AwsKmsPasswordHash-xxxxxx
displayName:
comment:
properties:
awsKmsSettings:
hashFunction:
Azure Certificate Authentication
Refer to the official Azure documentation on how to set up identity management and access control.
tenantId) This value is available in the Azure portal, e.g., in the tenant properties.
clientId) This value is available in the Azure portal, e.g., in the overview of your application registration.
keystore) The corresponding public key certificate must be registered for your application in the Azure portal, e.g., in the certificates & secrets page of your application registration.
The path must be absolute or relative to the instance root directory.
keystorePassword)
type: AzureCertificateAuthentication
id: AzureCertificateAuthentication-xxxxxx
displayName:
comment:
properties:
clientId:
keystore:
keystorePassword:
tenantId:
Azure Client Secret Authentication
Refer to the official Azure documentation on how to set up identity management and access control.
tenantId) This value is available in the Azure portal, e.g., in the tenant properties.
clientId) This value is available in the Azure portal, e.g., in the overview of your application registration.
clientSecret) This value is available in the Azure portal, e.g., in the certificates & secrets page of your application registration.
type: AzureClientSecretAuthentication
id: AzureClientSecretAuthentication-xxxxxx
displayName:
comment:
properties:
clientId:
clientSecret:
tenantId:
Azure Default Authentication
The plugin attempts to authenticate using the first available credential in the following order:
- Environment-based credentials
- Managed Identity (if running in Azure)
- Azure CLI credentials
type: AzureDefaultAuthentication
id: AzureDefaultAuthentication-xxxxxx
displayName:
comment:
properties:
Azure Message Broker Connector
Setup and configuration of Azure Event Hub and authentication infrastructure must be available, according to the Azure documentation.
eventHubNamespace) {your-namespace}.servicebus.windows.net
This value is available in the Azure portal.
eventHubName) This value is available in the Azure portal.
authentication) Dependending on the setup and available infrastructure, different methods may suit better. Refer to the individual plugin documentation for further explanations.
If authentication with Microsoft Entra ID is not possible, consider using a "Connection String" for direct access.
For successful authentication, ensure that the necessary certificates are available when a custom truststore is used with IAM.
For integration or if necessary, additional logging regarding connections to Azure can be enabled in the Log4J configuration. IAM documentation explains custom logging configuration.
Adjust the log levels for "com.azure", "com.azure.core.amqp", "com.microsoft.azure.proton.transport.proxy" or other libraries to your needs.
connectionString) Alternative service authentication method if general authentication with Microsoft Entra ID is not possible.
An Azure connection string contains all information required for an application to securely authenticate with and connect to an Azure Event Hub. It includes the service endpoint, authentication credentials (Shared Access Key), and an optional entity path (Event Hub name).A namespace-level connection string grants the specified permissions (manage, read, or write) for all Event Hubs within the namespace.
An Event Hub–level connection string (ends with ;EntityPath=<EventHubName>) grants the specified permissions only for that specific Event Hub.
Connection strings should only be used when authentication with Microsoft Entra ID is not available or for integration.
It is recommended to rotate connection strings regularly.
For successful authentication, ensure that the necessary certificates are available when a custom truststore is used with IAM.
For integration or if necessary, additional logging regarding connections to Azure can be enabled in the Log4J configuration. IAM documentation explains custom logging configuration.
Adjust the log levels for "com.azure", "com.azure.core.amqp" or other libraries to your needs.
transportType) AMQP is the default transport type and is recommended for most scenarios. Outbound connections use port 5671.
AMQP over Web Sockets is useful for environments where networking is restrictive or when a proxy configuration must be used. Outbound connections use port 443.
proxyHost) If this property is left empty, no proxy will be used.
proxyPort) proxyAuthenticationType) - None: The proxy requires no authentication. Configuration of a proxy login user and password is ignored.
- Basic Authentication: Uses a username and password sent in plaintext (Base64 encoded but not encrypted).
- Digest Authentication: Uses a username and password with challenge-response hashing for improved security.
proxyLoginUser) proxyLoginPassword) partitionKey) A partition key is used to map event data into specific partitions for data organization.
It enables keeping related events together in the same partition and in the exact order in which they arrived.
The partition key is derived from the application context and identifies the interrelationship of the events.
The partition key is used for all events sent to the event hub by this message broker connector.
type: AzureMessageBrokerConnector
id: AzureMessageBrokerConnector-xxxxxx
displayName:
comment:
properties:
authentication:
connectionString:
eventHubName:
eventHubNamespace:
partitionKey:
proxyAuthenticationType: NONE
proxyHost:
proxyLoginPassword:
proxyLoginUser:
proxyPort:
transportType: AMQP
Base64 Password Hash Encoder
type: Base64PasswordHashEncoder
id: Base64PasswordHashEncoder-xxxxxx
displayName:
comment:
properties:
Base64 String Encoder
encodingScheme) urlSafeEncoding)
type: Base64StringEncoder
id: Base64StringEncoder-xxxxxx
displayName:
comment:
properties:
encodingScheme: UTF-8
urlSafeEncoding: false
Basic Auth Credentials
userName) password)
type: BasicAuthCredentials
id: BasicAuthCredentials-xxxxxx
displayName:
comment:
properties:
password:
userName:
Basic Auth Error Mapper
Error Mapper that initiates Basic Authentication when the client does not send credentials or the credentials are not valid.
This plugin is designed to be used with "Basic Auth HTTP Header Extractor".
realm)
type: BasicAuthErrorMapperFactory
id: BasicAuthErrorMapperFactory-xxxxxx
displayName:
comment:
properties:
realm:
Basic Auth HTTP Header Extractor
Extracts username and password from the Basic Auth HTTP header.
Make sure to also configure the "Basic Auth Error Mapper" to respond with a corresponding "WWW-Authenticate" header in case of missing credentials.
charset) usernameTransformers) For further details please refer to the documentation of the username transformer plugins.
type: BasicAuthCredentialExtractorFactory
id: BasicAuthCredentialExtractorFactory-xxxxxx
displayName:
comment:
properties:
charset: UTF-8
usernameTransformers:
Basic Auth Request Authentication
passwordRepository) policyToCheckOnLogin) maxFailedAttempts) Effective only if a 'User Store' is configured.
charsetName) userStore) usernameTransformers) staticRoles) rolesBlocklist)
type: BasicAuthRequestAuthentication
id: BasicAuthRequestAuthentication-xxxxxx
displayName:
comment:
properties:
charsetName: UTF-8
maxFailedAttempts: 5
passwordRepository:
policyToCheckOnLogin:
rolesBlocklist:
staticRoles:
userStore:
usernameTransformers:
Basic Auth Token Introspection
Note: The basic auth scheme in OAuth 2.0 requests must comply to the specification in RFC 6749
charset) allowedUsers)
type: BasicAuthTokenIntrospection
id: BasicAuthTokenIntrospection-xxxxxx
displayName:
comment:
properties:
allowedUsers:
charset: UTF-8
Basic mTAN Settings
mtanHandler) smsGateway) originator) Originator of the SMS messages.
There may be restrictions on the originator imposed by the SMS gateway service and by local law.
The format of the originator must be one of:
- Numeric characters only, optionally prefixed with a plus sign '+', at most 16 characters
- Alphanumeric characters, at most 11 characters
defaultCountryCode) useFlashMessages) If enabled, SMS messages are sent as flash SMS by default. A flash message is shown directly on the mobile phone display.
If the per-user setting is set, it takes precedence as long as a value is set for a user. If it is empty or not set, this default value is used.
Note: This has to be supported by the SMS gateway. Some recipients might not be able to receive flash messages.
visiblePhoneNumberDigits) Defines the number of phone number digits visible in log statements and in selection options sent to the user.
If the value is zero, all digits are masked, if it is large enough, all digits are visible. Example: if set to 3, logged number looks like ********965.
The default is 100, i.e. showing all digits.
type: BasicMtanSettings
id: BasicMtanSettings-xxxxxx
displayName:
comment:
properties:
defaultCountryCode: 41
mtanHandler:
originator:
smsGateway:
useFlashMessages: false
visiblePhoneNumberDigits: 100
Basic Secret Question Settings
questionResourceKeys) Ensure that no new question with the same key is introduced later. Any user's answer to the previous question would not match the new question.
numberOfQuestions) normalization) - OFF:
No normalization. Provisioned and challenged answers must match exactly. - TRIM:
Removes whitespaces at the beginning and end of the answer string. - TRIM_CASEINSENSITIVE:
Does the same as TRIM and additionally converts all characters to lowercase. - TRIM_CASEINSENSITIVE_NOWHITESPACE:
Does the same as CASEINSENSITIVE_TRIM and additionally removes all whitespace. - TRIM_CASEINSENSITIVE_NOWHITESPACE_NOSPECIALCHARS:
Does the same as CASEINSENSITIVE_TRIM_NOWHITESPACE and additionally removes all non-word characters (all characters except letters, digits and the underscore).
tokenDataProvider) hashFunctionPlugin) NOTE: Some password hashes, such as SHA 256 Password Hash or Scrypt Password Hash, produce binary output. If one of these is used, make sure the persistence layer supports binary data in the hash field and the corresponding persistence plugins (e.g. Database User Store or Ldap Connector) are configured to treat hash values as binary values.
In case the persistence layer expects a string, encode the password hash by wrapping it with an encoder. To achieve this, use the Password Hash Configuration plugin and specify the hash function (such as Scrypt Password Hash) together with the desired encoder. We recommend using the Base64 Password Hash Encoder.
minLength) maxLength) answerRegexPattern) duplicateAnswersForbidden) checkUsingLatin1Encoding) If enabled, answers containing special characters stored by IAM earlier than 6.3 are still accepted. This option does not have to be activated if all answers were set using IAM 6.3 or later or if all answers were set via webservices or REST.
To support legacy answers, those with special characters are additionally checked using their legacy encoding in latin1.
type: BasicSecretQuestionSettings
id: BasicSecretQuestionSettings-xxxxxx
displayName:
comment:
properties:
answerRegexPattern:
checkUsingLatin1Encoding: false
duplicateAnswersForbidden: true
hashFunctionPlugin:
maxLength: 100
minLength: 2
normalization: TRIM_CASEINSENSITIVE
numberOfQuestions: 2
questionResourceKeys:
tokenDataProvider:
Bcrypt Password Hash
Returns $[version]$[cost]$[22 character salt][31 character hash] as a bcrypt string.
Security note: The bcrypt algorithm is no longer recommended for password hashing. Use "Argon2id Password Hash" instead.
cost) The value must be greater than or equal to 4 and less than or equal to 31. The number of iterations is stored together with the bcrypt string. Therefore, this value can be increased or decreased without losing backward compatibility.
version) - $2$: version prefix in the original specification.
- $2a$: version prefix in the revised specification defining encoding and null-terminator explicitly.
- $2y$, $2b$: version prefixes stating explicitly that the implementation is not affected by certain known bugs.
This has no effect when checking passwords as this implementation does not suffer from the known bugs and supports all versions. Therefore, this value can be changed without losing backward compatibility.
type: BcryptPasswordHash
id: BcryptPasswordHash-xxxxxx
displayName:
comment:
properties:
cost: 12
version: 2a
Bearer Token HTTP Header Extractor (as Token Credential)
Extracts a bearer token from the "Authorization" HTTP header and provides it as "Token Credential" to the authenticator.
This extractor is suitable for authenticators that are able to process token credentials, such as the "Token Authenticator" or the "OAuth 2.0 Access Token Authenticator".
type: BearerTokenHttpHeaderExtractor
id: BearerTokenHttpHeaderExtractor-xxxxxx
displayName:
comment:
properties:
Body And HTTP Status On Behalf Login Step Validator
httpStatusValidators) Provides a mean to have different validators depending on the HTTP status code of the response.
The map defines pairs of status codes (key) and validators (value). If the HTTP status code of the response matches to one of the following mappings, the corresponding validator gets executed. The key has to be a valid number.
If the response contains a status code that is not defined here, the "Default Body Status On Behalf Login Step Validator" is used for the validation.
defaultValidator)
type: BodyAndHttpStatusOnBehalfLoginStepValidator
id: BodyAndHttpStatusOnBehalfLoginStepValidator-xxxxxx
displayName:
comment:
properties:
defaultValidator:
httpStatusValidators:
Body Status On Behalf Login Step Validator
- The technical error patterns are validated. In case one of the technical error patterns matches, the validation fails.
- The access denied patterns are matched. In case one of the access denied patterns matches, the validation fails with an access denied error.
- In case one of the success patterns matches, the validation is successful. In case none of the success patterns match, the validation fails with a technical error.
successCases) accessDeniedCases) technicalErrorCases)
type: BodyStatusOnBehalfLoginStepValidator
id: BodyStatusOnBehalfLoginStepValidator-xxxxxx
displayName:
comment:
properties:
accessDeniedCases:
successCases:
technicalErrorCases:
Boolean Condition
true. valueProvider) isFulfilledIfValueIsNull)
type: BooleanCondition
id: BooleanCondition-xxxxxx
displayName:
comment:
properties:
isFulfilledIfValueIsNull: false
valueProvider:
Boolean Context Data
contextDataItemNameConfig) valueProviderConfig)
type: BooleanNonInteractiveUserDataItemDefinition
id: BooleanNonInteractiveUserDataItemDefinition-xxxxxx
displayName:
comment:
properties:
contextDataItemNameConfig:
valueProviderConfig:
Boolean Context Data Item
The database column must either be of an integer type (e.g. TINYINT, INTEGER containing either 0 or 1) or of a string type (e.g. VARCHAR, CHAR containing either "0" or "1") and the values of this context data item are guaranteed to be of type java.lang.Boolean. If the persistency has a NULL value or its value does not match the values above, FALSE is assumed.
contextDataName) databaseColumnName) readonlyOnUpdate)
type: BooleanContextDataItem
id: BooleanContextDataItem-xxxxxx
displayName:
comment:
properties:
contextDataName:
databaseColumnName:
readonlyOnUpdate: false
Boolean Context Data Item Name
contextDataName)
type: BooleanContextDataItemName
id: BooleanContextDataItemName-xxxxxx
displayName:
comment:
properties:
contextDataName:
Boolean Context Data Value Provider
Provides the boolean value contained in the specified context data item of the user.
Make sure the configured context data item is also configured on the user persister.
contextDataField) mandatory) If enabled, the value provided by this context data item is not allowed to be null.
If this option is enabled and the context data item is null (e.g. if the configured context data is not configured on the user persister), an exception will be thrown at runtime.
type: ContextDataBooleanValueProvider
id: ContextDataBooleanValueProvider-xxxxxx
displayName:
comment:
properties:
contextDataField:
mandatory: false
Boolean Data Transformer
Values which have been transformed by this transformer are guaranteed to be of type java.lang.Boolean.
properties) Use the asterisk character ("*") to replace all properties.
type: BooleanDataTransformer
id: BooleanDataTransformer-xxxxxx
displayName:
comment:
properties:
properties:
Boolean From Map Value Provider
'false' is returned.
If the provided value is a string, the provider will attempt to convert it to a boolean. Only true/false is recognized.
If the value is an incompatible type, or the string cannot be converted, an error is thrown.
valueMaps) key) provideFalseIfEmpty) 'false' instead of an empty value (null) if the key is not present in the value map.
type: BooleanFromMapValueProvider
id: BooleanFromMapValueProvider-xxxxxx
displayName:
comment:
properties:
key:
provideFalseIfEmpty: false
valueMaps:
Boolean Input Token Controller Element
label) property) The referenced property must be available in the attributes value of the generic token REST call response. If the property is nested, e.g. inside the contextData key, it can be referenced with dot notation (see example values).
readOnly)
type: BooleanInputTokenControllerUiElement
id: BooleanInputTokenControllerUiElement-xxxxxx
displayName:
comment:
properties:
label:
property:
readOnly: false
Boolean User Context Data Item
contextDataName) required) valueMustBeTrue) valueMustBeFalse)
type: BooleanContextDataItemDefinition
id: BooleanContextDataItemDefinition-xxxxxx
displayName:
comment:
properties:
contextDataName:
required: true
valueMustBeFalse: false
valueMustBeTrue: false
Boolean User Profile Item
formatAsBooleanObject) stringResourceKey) propertyName) optional) modifiable) validateOnlyChangedValues) sortable)
type: BooleanUserProfileItem
id: BooleanUserProfileItem-xxxxxx
displayName:
comment:
properties:
formatAsBooleanObject: true
modifiable: true
optional: true
propertyName:
sortable: true
stringResourceKey:
validateOnlyChangedValues: true
Button Group UI Element
buttons)
type: ConfigurableUiButtonGroup
id: ConfigurableUiButtonGroup-xxxxxx
displayName:
comment:
properties:
buttons:
Button UI Element
label) disabledOnValidationErrors) disabledWithNoChanges) alignment) submit) onClick) htmlId)
type: ConfigurableUiButton
id: ConfigurableUiButton-xxxxxx
displayName:
comment:
properties:
alignment: RIGHT
disabledOnValidationErrors: true
disabledWithNoChanges: true
htmlId:
label:
onClick:
submit: false
Caching Certificate Status Checker
cacheEntryLifetime) maximumCacheSize) wrappedStatusChecker)
type: CachingCertificateStatusChecker
id: CachingCertificateStatusChecker-xxxxxx
displayName:
comment:
properties:
cacheEntryLifetime: 60
maximumCacheSize: 1000
wrappedStatusChecker:
Cancel Button UI Element
label) alignment) htmlId)
type: ConfigurableUiCancelButton
id: ConfigurableUiCancelButton-xxxxxx
displayName:
comment:
properties:
alignment: RIGHT
htmlId: cancelButton
label: cancel
CAPTCHA Processor
Note: This processor must be the first in the list of available processors.
type: CaptchaProcessor
id: CaptchaProcessor-xxxxxx
displayName:
comment:
properties:
CAPTCHA UI Element
type: ConfigurableCaptcha
id: ConfigurableCaptcha-xxxxxx
displayName:
comment:
properties:
Certificate Authenticator
Warning 1: This authenticator assumes that some external process can guarantee that the certificate belongs to the authenticating entity. This is typically done by challenging the entity to sign something with the corresponding private key. This is, for example, the case in an SSL handshake involving client certificate verification.
Warning 2: This authenticator does not check whether the certificate was signed by a trusted entity. This must be done prior to calling this authenticator, typically during an SSL handshake.
The credentials passed to this authenticator must be of type
If the credential contains a username (subtype of
If the credential contains a username but no certificate (type CERTIFICATE_REQUIRED. This makes it suitable for usage with the
What checks are done on the certificate and how the user name and granted roles (and possibly other data) are determined is specified by the configuration.
There are two different (and mutual exclusive) ways how this plugin determines the username given the client certificate:
(1) Extract username from client certificate. In this case the username potentially passed as credential is ignored. Look at configuration property user-attribute for this case.
(2) Take user name from the credential. In this case, the credential must contain a username.
Independent of the way the username has been determined, a credential persister can be used to verify that the client certificate really belongs to the username. See property credential-persister for details. If the client certificate does not match the data stored under the determined username, the authentication response AuthenticationFailedCertificate.CERTIFICATE_DOES_NOT_MATCH_USER is returned.
The plugin writes the canonical class name description of this plugin to the context data container. The class name is stored under the key authPluginClassName . A short description of this authentication method is stored under the key authMethodShortDesc . This information may be used by callers.
userAttribute) If a credential persister is configured (see below), the extracted user name is used to look up the credential bean. The bean can be used for further checks.
Note: This can be used to find a user mapped to the certificate (e.g. the CN of the certificate is stored with the username in the persistence layer). To do so, configure the credential persister accordingly to look up the credential data given the value defined by this property(which does not necessarily have to be the real username). Then use the credential-bean-username property below to read the real username from the credential bean.
Note: This property has precedence over the username in the credential object. Thus, if this property is defined, any user information passed as credential is ignored.
Usually the username is part of the DN (distinguished name) of the certified subject.
This attribute specifies the attribute name of the username in the DN. Example: The value "cn" will extract the common name from the DN and use this as username.
The following values are treated especially:
- "dn": use this value to use the whole distinguished name as username.
- "altSubjectName": use this value to use the alternative subject name as username.
If this property is not defined, the plugin takes the username from the credential.
Look at property credential-persister to see how to validate that the user is registered with for this client certificate.
stripDomainFromUsername) This property is ignored if the configuration property "user-attribute" is not defined or set to "dn".
credentialPersister) If this property is defined, the plugin is used to look up a credential bean using the determined username (or other id determined by this plugin). Then a check is performed whether the certificate really belongs to the user. The check is defined by the separate configuration property "matchPolicy".
How this plugin reacts if no credential record can be found is specified by the separate property "treat-no-credential-data-as-not-assigned".
usernameTransformers) Username transformers may transform the name a user states in the login-form into the single unique user-id required for the authentication process.
The transformation of a username takes place after extracting the user name from the presented certificate and before the authenticator reads the user from persistency layer. If a username is supplied from a previous authentication step, then no transformation is done here.
Transfomers can be chained, i.e. a first transformer could normalize the original name, where the next transformer looks-up the normalized name in a database for eventual transformation matches.
A transformer can also signal that it already found the final user-id and the chain must stop after him.
doNotUpdateUserStatistics) This property is only relevant if a user persister is configured.
matchPolicy) This check is only done if a credential bean has been loaded using the configured credential persister.
The credential data of the credential bean is compared to the certificate depending on the value of this property:
- "DNs" : The distinguished names (DN) of the certificate subject and the issuer is compared to the string data of the credential bean. The comparison is case-insensitive. The DNs are encoded in the following form for comparison: <issuer-dn>ISSUER-DN</issuer-dn><subject-dn>SUBJECT-DN</subject-dn>
This is the default value. - "subject-DN" : The DN of the certificate subject is compared to the string data of the credential bean. The comparison is case-insensitive. This setting can be combined with the setting "issuer-dn-property"
- "CN" : The common name (CN) of the certificate subject is compared to the string data of the credential bean. The comparison is case-insensitive. This setting can be combined with the setting "issuer-dn-property"
- "TBS" : The TBS (to-be-signed) part of the certificate is compared to the string or binary data of the credential bean. If the credential data is binary, the comparison is done byte-wise, if it is a string type credential, the TBS-part is base64-encoded before comparing.
- "certificate" : The X509 certificate is compared to the string or binary data of the credential bean. If the credential data is binary, the comparison is done byte-wise, if it is a string type credential, the certificate is base64-encoded before comparing.
- "NONE" : No check is performed.
Note: For backwards-compatibility, the default value of this property is "DNs"!
If a credential record can be found but it contains no credential data, this plugin responds with CREDENTIAL_NOT_ASSIGNED (can for example start a registration process), if credential data can be found but does not match in this check, CERTIFICATE_DOES_NOT_MATCH_USER. How the plugin behaves if no credential record can be found at all is defined property "treat-no-credential-data-as-not-assigned".
issuerDnProperty) This setting is only used in conjunction with match policies "CN" and "subject-DN" and requires that a credential persister is configured: In addition to matching the cn or subject dn the issuer DN is also compared to the value stored in the context property (of the credential context container) referenced by this setting.
The comparison is case-insensitive.
multiFormatDnComparison) - a=A,b=B,c=C
- c=C,b=B,a=A (backwards)
- /a=A/b=B/c=C (slash notation)
- /c=C/b=B/a=A (slash notation backwards)
- a=A,b=B,x.y.z=C (where x.y.z is the OID for attribute c)
This affects match policy "subject-DN" and it affects issuer DN comparison if the property "issuer-dn-property" is defined.
userProperty) This property is used in situations where the username cannot be extracted directly from the certificate but it is determined by looking up a credential bean and reading the username from it. If the referenced context data property cannot be found, an AuthenticatorException is thrown.
If this property is defined, it usually makes sense to also set the property "treat-no-credential-data-as-not-assigned" to true.
treatNoCredDataAsNotAssigned) CREDENTIAL_NOT_ASSIGNED if no credential bean can be found at all. If it is "FALSE" (which is the default), this plugin responds with USER_NOT_FOUND.
This property exists to make this plugin suitable for situations where the username cannot be extracted directly from the certificate but it is determined by looking up a credential bean and reading the username from it. In this case not finding a credential bean at all usually means that the certificate has not yet been assigned. In the other case - i.e. the username is directly read from the certificate - not finding the credential bean usually means that the user does no more exist.
staticRoles) certificateStatusChecker) Note: If this optional property is not defined or empty (and no certificate status checker plugins are configured by the property "Cert Status Checkers"), no status check is performed (i.e. all certificates are considered to be non-revoked).
userPersister) - User is not found
- Username is ambiguous
- User is locked
- User is not valid
maxFailedLogins) expiringCertificateWarningDays) additionalUserValidators) checkValidityPeriod) certStatusCheckers)
type: CertificateAuthenticator
id: CertificateAuthenticator-xxxxxx
displayName:
comment:
properties:
additionalUserValidators:
certStatusCheckers:
certificateStatusChecker:
checkValidityPeriod: true
credentialPersister:
doNotUpdateUserStatistics: false
expiringCertificateWarningDays:
issuerDnProperty:
matchPolicy: DNs
maxFailedLogins: 0
multiFormatDnComparison: false
staticRoles:
stripDomainFromUsername: false
treatNoCredDataAsNotAssigned: false
userAttribute:
userPersister:
userProperty:
usernameTransformers:
Certificate Credential Extraction Step
certificateRequired) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: CertificateCredentialExtractionStep
id: CertificateCredentialExtractionStep-xxxxxx
displayName:
comment:
properties:
certificateRequired: true
customFailureResponseAttributes:
customResponseAttributes:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Certificate Data Extractor Task
This task can be used to retrieve information encoded in the certificate and write it to the user record so the information can be used in search criteria, queries or be displayed more easily in the admin tool.
The certificate data read from the record must be the base-64 encoded binary representation of an X.509 ASN.1 structure. It also can be only the TBS-part ("to-be-signed part") of the certificate.
credentialPersister) The returned credentials must either contain the certificate data in the string credential field or in one of the context data fields. In the latter case, the name of the context data field containing the certificate data must be specified in property "certificate-property".
Make sure the persister is able to store the target field(s), i.e. the field(s) where the extracted data is stored. It is usally necessary to list these fields in the context data container.
credentialIterator) It is usually a good idea to already include a "not-null"-check on the certificate data and "null"-checks in the fields where the extracted data is stored. Like this only the records with missing (i.e. not yet processed) data are processed.
certificateProperty) isTbsData) mapping)
type: CertificateDataExtractorTask
id: CertificateDataExtractorTask-xxxxxx
displayName:
comment:
properties:
certificateProperty:
credentialIterator:
credentialPersister:
isTbsData: false
mapping:
Certificate Data to Context Data Mapping
certificateDataElement) - "notBefore": Validity start date.
- "notAfter": Validity end date.
- "subjectDn": Distinguished name of the subject.
- "subjectCn": Common name of the subject.
- "issuerDn": Distinguished name of the issuer.
- "serial": Certificate serial number.
contextProperty)
type: CertificateDataExtractorTaskMapping
id: CertificateDataExtractorTaskMapping-xxxxxx
displayName:
comment:
properties:
certificateDataElement:
contextProperty:
Certificate Subject Organization Identifier Equality Credential Verifier
type: CertificateSubjectOrganizationIdentifierEqualityCredentialVerifier
id: CertificateSubjectOrganizationIdentifierEqualityCredentialVerifier-xxxxxx
displayName:
comment:
properties:
Certificate Token Authenticator
Warning 1: This authenticator assumes that some external process can guarantee that the certificate belongs to the authenticating entity. This is typically done by challenging the entity to sign something with the corresponding private key. This is, for example, the case in an SSL handshake involving client certificate verification.
Warning 2: This authenticator does not check whether the certificate was signed by a trusted entity. This must be done prior to calling this authenticator, typically during an SSL handshake.
certificateMatcher) staticRoles) updateUserStatistics) updateTokenStatistics) userPersister) - User is not found
- Username is ambiguous
- User is locked
- User is not valid
maxFailedLogins) expiringCertificateWarningDays) additionalUserValidators) checkValidityPeriod) certStatusCheckers)
type: CertificateTokenAuthenticator
id: CertificateTokenAuthenticator-xxxxxx
displayName:
comment:
properties:
additionalUserValidators:
certStatusCheckers:
certificateMatcher:
checkValidityPeriod: true
expiringCertificateWarningDays:
maxFailedLogins: 0
staticRoles:
updateTokenStatistics: true
updateUserStatistics: true
userPersister:
Certificate Token Controller
tokenDataProvider) allowedAsActive)
type: CertificateTokenController
id: CertificateTokenController-xxxxxx
displayName:
comment:
properties:
allowedAsActive: true
tokenDataProvider:
Certificate Token Credential Extractor
type: CertificateTokenCredentialExtractor
id: CertificateTokenCredentialExtractor-xxxxxx
displayName:
comment:
properties:
Chaining Identity Propagator
Note: The configured identity propagators are processed in the defined order.
This plugin is useful if more than one identity propagator should be used.
idPropagators)
type: ChainingIdentityPropagator
id: ChainingIdentityPropagator-xxxxxx
displayName:
comment:
properties:
idPropagators:
Changed Email Address Provider
type: ChangedEmailProvider
id: ChangedEmailProvider-xxxxxx
displayName:
comment:
properties:
Checkbox UI Element
label) property) validation) labelLeft) htmlId) submitToServer) initialValueQuery) See the JSONPath documentation for the full documentation: https://github.com/dchester/jsonpath
Examples:Assume the initial REST call returns the following JSON response:
{
"meta": {
"type": "jsonapi.metadata.document",
"timestamp": "2023-03-10T13:06:01.294+02:00"
},
"data": [
{
"type": "user",
"id": "user1",
"attributes": {
"contextData": {
"givenname": "User1",
"surname": "FSMTest",
"roles": "customerA"
}
}
},
{
"type": "user",
"id": "user2",
"attributes": {
"contextData": {
"givenname": "User2",
"surname": "FSMTest",
"roles": "customerB"
}
}
}
]
}
The following table shows the results of various JSONPath queries given the JSON above:
Description JSONPath Query Extracted Initial Value Static path from the root $.meta.type jsonapi.metadata.document The role of the user whose id equals "user1" $.data[?(@.id == 'user1')].attributes.contextData.roles customer The number of users $.data.length 2 All "givenname" attributesNote:
This query yields multiple results.
The first one is set to the initial value, the rest is discarded. $..givenname User1
type: ConfigurableUiCheckbox
id: ConfigurableUiCheckbox-xxxxxx
displayName:
comment:
properties:
htmlId:
initialValueQuery:
label:
labelLeft: true
property:
submitToServer: true
validation:
Cipher Credential Persister
Encrypts and decrypts selected fields of credential data. Uses an underlying other credential persister plugin to load and store data, i.e. it is applicable to any other credential persister plugin.
Note that data that is not (yet) encrypted can be read as plaintext. The first time the field is written(because of a change in the very field itself), it will be encrypted. This makes migration of data and mixture with encrypted and non-encrypted data possible. It also implies that this encryption provides secrecy (confidentiality) but no authenticity!
The following restrictions apply when using data field encryption:
- Encryption can only be applied to the serial number, the credential data and context data fields.
- Encryption of context data properties can only be applied to string type properties.
- Encryption cannot be applied to the username (even if part of the context data container)
- Searching on encrypted fields is not supported.
- If encrypting a context data property that is also used by other persister plugins (e.g. a user persister plugin), make sure that the other plugin also encrypts the field.
- Note that encrypted strings are larger than their plain counterpart. Make sure to allow long strings in the underlying persister plugin. The shortest encrypted string is 38 characters long. For longer strings, doubling the plain string length makes a good upper boundary.
credentialPersister) encryptSerial) encryptCredentialData) encryptedContextProperties) Specifies a list of names of string context data properties that have to be stored encrypted on the database.
cipherPassword) Password used for the encryption and decryption.
If other persister plugins (e.g. a UserPersister plugin) also use encryption on data fields encrypted in this plugin, make sure they use the same password.
This property supports the extended string syntax, i.e. its value may be configured scrambled or in an external file (see example values).
type: CipherCredentialPersister
id: CipherCredentialPersister-xxxxxx
displayName:
comment:
properties:
cipherPassword:
credentialPersister:
encryptCredentialData: true
encryptSerial: false
encryptedContextProperties:
Cipher Token List Persister
Encrypts and decrypts selected context data fields of token list data structure. Uses an underlying other token list persister plugin to load and store data, i.e. it is applicable to any other token list persister plugin.
Note that data that is not (yet) encrypted can be read as plaintext. The first time the field is written(because of a change in the very field itself), it will be encrypted. This makes migration of data and mixture with encrypted and non-encrypted data possible. It also implies that this encryption provides secrecy (confidentiality) but no authenticity!
The following restrictions apply when using data field encryption:
- Encryption can only be applied to context data fields.
- Encryption can only be applied to string type properties.
- Encryption cannot be applied to the username (even if part of the context data container)
- Searching on encrypted fields is not supported.
- If encrypting a context data property that is also used by other persister plugins (e.g. a user persister plugin), make sure that the other plugin also encrypts the field.
- Note that encrypted strings are larger than their plain counterpart. Make sure to allow long strings in the underlying persister plugin. The shortest encrypted string is 38 characters long. For longer strings, doubling the plain string length makes a good upper boundary.
tokenListPersister) encryptedContextProperties) Specifies a list of names of string context data properties that have to be stored encrypted on the database.
cipherPassword) Password used for the encryption and decryption.
If other persister plugins (e.g. a UserPersister plugin) also use encryption on data fields encrypted in this plugin, make sure they use the same password.
This property supports the extended string syntax, i.e. its value may be configured scrambled or in an external file (see example values).
type: CipherTokenListPersister
id: CipherTokenListPersister-xxxxxx
displayName:
comment:
properties:
cipherPassword:
encryptedContextProperties:
tokenListPersister:
Cipher User Persister
Encrypts and decrypts selected fields of user data. Uses an underlying other user persister plugin to load and store data, i.e. it is applicable to any other user persister plugin.
The method changeUsername(String oldUsername, String newUsername) is not implemented and will throw a NotImplementedException.
Note that data that is not (yet) encrypted can be read as plaintext. The first time the field is written (because of a change in the very field itself), it will be encrypted. This makes migration of data and mixture with encrypted and non-encrypted data possible. It also implies that this encryption provides secrecy (confidentiality) but no authenticity!
The following restrictions apply when using data field encryption:
- Encryption can only be applied to context data fields.
- Encryption can only be applied to string type fields.
- Encryption cannot be applied to the username (even if part of the context data container)
- Searching on encrypted fields is not supported.
- If encrypting a context data property that is also used by other persister plugins (e.g. a credential persister plugin), make sure that the other plugin also encrypts the field.
- Note that encrypted strings are larger than their plain counterpart. Make sure to allow long strings in the underlying persister plugin. The shortest encrypted string is 38 characters long. For longer strings, doubling the plain string length makes a good upper boundary but some encryption mechanisms will still produce much longer output.
userPersister) encryptedContextProperties) Specifies a list of names of string context data properties that have to be stored encrypted on the database.
cipherPassword) Password used for the encryption and decryption.
If other persister plugins (e.g. a CredentialPersister plugin) also use encryption on context data fields listed in this plugin, make sure they use the same password.
This property supports the extended string syntax, i.e. its value may be configured scrambled or in an external file (see example values).
type: CipherUserPersister
id: CipherUserPersister-xxxxxx
displayName:
comment:
properties:
cipherPassword:
encryptedContextProperties:
userPersister:
Claim From Subject Token (OAuth 2.0 Token Exchange)
Sets the claim to the configured claim value of the subject token.
If the referenced subject token data does not contain any value, it will be ignored.
subjectTokenDataName)
type: OAuth2TokenExchangeJwtSubjectTokenClaimValue
id: OAuth2TokenExchangeJwtSubjectTokenClaimValue-xxxxxx
displayName:
comment:
properties:
subjectTokenDataName:
Claim Set Custom Claim
customClaims) claimName) claimCondition) This custom claim will only be added to the issued token if the configured condition is satisfied.
If no condition is configured, the custom claim will always be added.
type: CustomClaimSetClaim
id: CustomClaimSetClaim-xxxxxx
displayName:
comment:
properties:
claimCondition:
claimName:
customClaims:
Claim Validator
claim) mandatory) validationPattern)
type: ClaimValidatorSettings
id: ClaimValidatorSettings-xxxxxx
displayName:
comment:
properties:
claim:
mandatory: true
validationPattern:
Client Certificate (X.509) Credential Extractor
type: ClientCertificateExtractor
id: ClientCertificateExtractor-xxxxxx
displayName:
comment:
properties:
Client Certificate (X.509) Request Authentication
Authenticates single requests by their client certificate.
Warning 1: This authentication assumes that some external process can guarantee that the certificate belongs to the authenticating entity. This is typically done by challenging the entity to sign something with the corresponding private key. This is, for example, the case in an SSL handshake involving client certificate verification.
Warning 2: This authentication does not check whether the certificate was signed by a trusted entity. This must be done during the SSL handshake.
userAttribute) Defines how the username is extracted from the certificate.
Usually the username is part of the DN (distinguished name) of the certified subject. This attribute specifies the attribute name of the username in the DN. Example: The value "cn" will extract the common name from the DN and use this as username.
The following values are interpreted separately:
- dn: the whole distinguished name is used.
- subjectAlternativeName: the alternative subject name is used.
- certificate: the base64 encoded certificate.
Username transformation can be used to lookup the user based on a context-data field or to modify the extracted username (e.g. to strip the domain from the name).
checkValidityPeriod) certStatusCheckers) userStore) usernameTransformers) staticRoles) rolesBlocklist)
type: ClientCertificateRequestAuthentication
id: ClientCertificateRequestAuthentication-xxxxxx
displayName:
comment:
properties:
certStatusCheckers:
checkValidityPeriod: true
rolesBlocklist:
staticRoles:
userAttribute:
userStore:
usernameTransformers:
Client Certificate Context Extractor
Context extractor that determines the context by matching configurable regular expressions against information in the client certificate extracted from the request.
This extractor works in conjunction with client certificate authentication.
mappings) Defines mappings of regular expressions patterns to configuration contexts.
Each pattern is matched in order against the issuer distinguished name (DN) of the extracted client certificate.
The first matching pattern determines the resulting configuration context.
matchAgainstSubjectDn) fallbackContext) Leave empty to implicitly use the default context. If this plugin is used within a "Combining Context Extractor", use "[DEFAULT]" to explicitly return the default context if necessary.
gateway) The client certificate is extracted differently from the request based on this configuration:
- Airlock Gateway (WAF): certificate is extracted from the environment cookie
- Airlock Microgateway: certificate is extracted from the configured header
- When no gateway is configured, attempt to extract the client certificate from the jakarta.servlet.request.X509Certificate request attribute
type: ClientCertificateContextExtractor
id: ClientCertificateContextExtractor-xxxxxx
displayName:
comment:
properties:
fallbackContext:
gateway:
mappings:
matchAgainstSubjectDn: false
Client Certificate Context Extractor Pattern
pattern) configurationContext) Use "[DEFAULT]" to explicitly return the default context.
type: ContextPatternForClientCertificateContextExtractor
id: ContextPatternForClientCertificateContextExtractor-xxxxxx
displayName:
comment:
properties:
configurationContext:
pattern:
Client Certificate PEM Format
If an invalid format is presented, the certificate cannot be extracted.
type: ClientCertificatePemExtractionFormat
id: ClientCertificatePemExtractionFormat-xxxxxx
displayName:
comment:
properties:
Client Certificate XFCC Format
The XFCC is a proxy header which indicates certificate information of part or all of the clients or proxies that a request has flowed through, on its way from the client to the server.
IAM requires that the Cert key is set in the XFCC header under which the URL encoded PEM certificate is contained.
Envoy and other proxies in between, e.g. Airlock Micogateway, must be configured accordingly.
If an invalid format is presented, the certificate cannot be extracted.
type: ClientCertificateXfccExtractionFormat
id: ClientCertificateXfccExtractionFormat-xxxxxx
displayName:
comment:
properties:
Client Fingerprinting Score Risk Extractor
clientFingerprintingThreshold) tagsWhenAboveOrEqualThreshold) tagsWhenBelowThreshold)
type: ClientFingerprintingScoreRiskExtractor
id: ClientFingerprintingScoreRiskExtractor-xxxxxx
displayName:
comment:
properties:
clientFingerprintingThreshold:
tagsWhenAboveOrEqualThreshold:
tagsWhenBelowThreshold:
Client ID Custom Claim
claimName) claimCondition) This custom claim will only be added to the issued token if the configured condition is satisfied.
If no condition is configured, the custom claim will always be added.
type: CustomClientIdClaim
id: CustomClientIdClaim-xxxxxx
displayName:
comment:
properties:
claimCondition:
claimName:
Client ID From Request
Warning: the specification explicitly forbids clients to create their own client identifier due to privacy and security issues. Use this plugin with caution.
requestParameter) client_id).
type: ClientIdFromRequest
id: ClientIdFromRequest-xxxxxx
displayName:
comment:
properties:
requestParameter:
Client ID From Subject Token (OAuth 2.0 Token Exchange)
Sets the claim value to that of the subject token's "client_id" data.
Only string values are considered. If the subject token's "client_id" data is a not a string value, the token exchange request will lead to an invalid request error.
type: OAuth2TokenExchangeJwtSubjectTokenClientIdClaimValue
id: OAuth2TokenExchangeJwtSubjectTokenClientIdClaimValue-xxxxxx
displayName:
comment:
properties:
Client ID Of Authenticated Client (OAuth 2.0 Token Exchange)
type: OAuth2TokenExchangeJwtAuthenticatedClientIdStringClaimValue
id: OAuth2TokenExchangeJwtAuthenticatedClientIdStringClaimValue-xxxxxx
displayName:
comment:
properties:
Client IP SAML 2.0 Attribute
samlAttributeName) nameFormat)
type: ClientIpAttribute
id: ClientIpAttribute-xxxxxx
displayName:
comment:
properties:
nameFormat: urn:oasis:names:tc:SAML:2.0:attrname-format:basic
samlAttributeName:
Client Name Processor
If not configured, no "client_name" is stored, and the client is simply displayed as "DCR OAuth 2.0 Client".
allowedValues) mandatory)
type: ClientNameProcessor
id: ClientNameProcessor-xxxxxx
displayName:
comment:
properties:
allowedValues: [a-zA-Z0-9 _.-]+
mandatory: false
Coloring Rule
regexpPatternString) foregroundColor) backgroundColor) foregroundColorForMetaData)
type: ColoringRule
id: ColoringRule-xxxxxx
displayName:
comment:
properties:
backgroundColor: white
foregroundColor: black
foregroundColorForMetaData: black
regexpPatternString:
Combined Password Hash
PasswordHash for hash generation and a list of PasswordHash functions for checking / verification. Verification is passed, if one of the configured hashes can verify the password with its hash. hashForGeneration) hashesForVerification)
type: CombinedPasswordHash
id: CombinedPasswordHash-xxxxxx
displayName:
comment:
properties:
hashForGeneration:
hashesForVerification:
Combining Context Extractor
contextExtractors) fallbackContext) Leave empty to implicitly use the default context. If this plugin is used within a "Combining Context Extractor", use "[DEFAULT]" to explicitly return the default context if necessary.
type: CombiningContextExtractor
id: CombiningContextExtractor-xxxxxx
displayName:
comment:
properties:
contextExtractors:
fallbackContext:
Combining Extended User Persister
userInsertionPersister) persisters) Allow Duplicates. allowDuplicates) Potentially the user may be found by an other persister. If this flag is set to false, always all inner persisters are asked, and if a userId is found by multiple inner persisters, a NotUniqueException is thrown.
Iterator methods are always called on all persisters, but if Allow Duplicates is enabled, no exception is thrown in case of duplicates.
type: CombiningExtendedUserPersister
id: CombiningExtendedUserPersister-xxxxxx
displayName:
comment:
properties:
allowDuplicates: false
persisters:
userInsertionPersister:
Combining Role Provider
roleProviders)
type: CombiningRoleProvider
id: CombiningRoleProvider-xxxxxx
displayName:
comment:
properties:
roleProviders:
Combining User Persister
persisters) Allow Duplicates. allowDuplicates) Potentially the user may be found by an other persister. If this flag is set to false, always all inner persisters are asked, and if a userId is found by multiple inner persisters, a NotUniqueException is thrown.
Iterator methods are always called on all persisters, but if Allow Duplicates is enabled, no exception is thrown in case of duplicates.
type: CombiningUserPersister
id: CombiningUserPersister-xxxxxx
displayName:
comment:
properties:
allowDuplicates: false
persisters:
Complete Migration Step
targetAuthMethod) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: CompleteMigrationStep
id: CompleteMigrationStep-xxxxxx
displayName:
comment:
properties:
customFailureResponseAttributes:
customResponseAttributes:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
targetAuthMethod:
Composite Password Service
checkPasswordPasswordService) changePasswordPasswordService) resetPasswordPasswordService)
type: CompositePasswordService
id: CompositePasswordService-xxxxxx
displayName:
comment:
properties:
changePasswordPasswordService:
checkPasswordPasswordService:
resetPasswordPasswordService:
Concatenating Context Extractor
contextExtractors) fallbackContext) Leave empty to implicitly use the default context. If this plugin is used within a "Combining Context Extractor", use "[DEFAULT]" to explicitly return the default context if necessary.
type: ConcatenatingContextExtractor
id: ConcatenatingContextExtractor-xxxxxx
displayName:
comment:
properties:
contextExtractors:
fallbackContext:
Concatenating Data Transformer
Values which have been transformed by this transformer are guaranteed to be of type java.lang.String.
attributes) Use the asterisk character ("*") to replace all attributes.
type: ConcatenatingDataTransformer
id: ConcatenatingDataTransformer-xxxxxx
displayName:
comment:
properties:
attributes:
Condition-based Role Provider
condition) roles)
type: ConditionBasedRoleProvider
id: ConditionBasedRoleProvider-xxxxxx
displayName:
comment:
properties:
condition:
roles:
Conditional Identity Propagator
conditionsLogicMode) - AND: All conditions must be true.
- OR: At least one condition must be true.
conditions) identityPropagator)
type: ConditionalIdentityPropagator
id: ConditionalIdentityPropagator-xxxxxx
displayName:
comment:
properties:
conditions:
conditionsLogicMode: AND
identityPropagator:
Conditional Risk-based Role Derivation
conditions) targetRoles)
type: ConditionalRiskBasedRoleDerivation
id: ConditionalRiskBasedRoleDerivation-xxxxxx
displayName:
comment:
properties:
conditions:
targetRoles:
Conditional Value Map Provider
condition) valueMapProvider)
type: ConditionalValueMapProvider
id: ConditionalValueMapProvider-xxxxxx
displayName:
comment:
properties:
condition:
valueMapProvider:
Configurable Error Mapper
authenticationFailures) Maps authentication failure types to HTTP error responses.
The authentication failure types can be defined by the authenticator. Known types seen in one-shot flow:
- "user not found"
- "user required"
- "user name ambiguous"
- "user locked"
- "user temporarily locked"
- "user invalid"
- "user not permitted at this time"
- "user not permitted at this client"
- "device blocked"
- "device busy with another authentication request"
- "unspecified"
- "password required"
- "password wrong"
- "password change required"
- "token required"
- "token wrong"
- "next token required"
- "binding token required"
- "token expired"
- "certificate required"
- "certificate does not match user"
- "certificate not yet valid"
- "certificate expired"
- "certificate revoked"
- "certificate issuer not trusted"
defaultAuthenticationFailure) userHasNoAccess) credentialCannotBeExtracted)
type: ConfigurableErrorMapperFactory
id: ConfigurableErrorMapperFactory-xxxxxx
displayName:
comment:
properties:
authenticationFailures:
credentialCannotBeExtracted:
defaultAuthenticationFailure:
userHasNoAccess:
Configurable HTTP CRL Obtainer
cachePersister) defaultObtainer) overwritingObtainers)
type: MultiIssuerConfigurableHTTPCrlObtainer
id: MultiIssuerConfigurableHTTPCrlObtainer-xxxxxx
displayName:
comment:
properties:
cachePersister:
defaultObtainer:
overwritingObtainers:
Configuration-based Authenticator
users)
type: ConfigurationBasedAuthenticator
id: ConfigurationBasedAuthenticator-xxxxxx
displayName:
comment:
properties:
users:
Configured User Data
username) password) roles)
type: ConfiguredUserData
id: ConfiguredUserData-xxxxxx
displayName:
comment:
properties:
password:
roles:
username:
Contacts Processor
allowedContacts) mandatory)
type: ContactsProcessor
id: ContactsProcessor-xxxxxx
displayName:
comment:
properties:
allowedContacts: [a-zA-Z0-9 _.@-]+
mandatory: true
Context Data Access Rule
contextDataField) roles)
type: ContextDataAccessRule
id: ContextDataAccessRule-xxxxxx
displayName:
comment:
properties:
contextDataField:
roles:
Context Data Changed
fieldNamePattern)
type: ContextDataChangedSubscribedEvent
id: ContextDataChangedSubscribedEvent-xxxxxx
displayName:
comment:
properties:
fieldNamePattern: .*
Context Data Condition
name) pattern)
type: ContextDataCondition
id: ContextDataCondition-xxxxxx
displayName:
comment:
properties:
name:
pattern:
Context Data Item
contextDataItemName) To be able obtain the context data value, it is required to add an 'OAuth 2.0 Remote Context Data Resource' with a 'Local Context Data Key' equal to this value to the resource mappings.
optional)
type: ContextDataItem
id: ContextDataItem-xxxxxx
displayName:
comment:
properties:
contextDataItemName:
optional: false
Context Data Item (Airlock 2FA Account Display Name)
contextDataName) mandatory)
type: Airlock2FAContextDataDisplayNameProvider
id: Airlock2FAContextDataDisplayNameProvider-xxxxxx
displayName:
comment:
properties:
contextDataName:
mandatory: false
Context Data Map
Provides all context data of the current user. The keys of the context data items are provided as defined in the Loginapp's user store.
The "username" is always part of the map, even if it is not explicitly part of the context data.
type: ContextDataValueMapProvider
id: ContextDataValueMapProvider-xxxxxx
displayName:
comment:
properties:
Context Data Regex Condition
contextDataKey) The context data field for which the value is matched against the configured pattern.
For newly created users (before/after insert user events), some context data fields (e.g. the username field or "additional context data") are not available.
pattern) isFulfilledIfValueIsNull)
type: ContextDataEventCondition
id: ContextDataEventCondition-xxxxxx
displayName:
comment:
properties:
contextDataKey:
isFulfilledIfValueIsNull: false
pattern:
Context Data SAML 2.0 Attribute
samlAttributeName) contextDataName) nameFormat)
type: ContextDataAttribute
id: ContextDataAttribute-xxxxxx
displayName:
comment:
properties:
contextDataName:
nameFormat: urn:oasis:names:tc:SAML:2.0:attrname-format:basic
samlAttributeName:
Context Data String Custom Claim
contextDataName) claimName) claimCondition) This custom claim will only be added to the issued token if the configured condition is satisfied.
If no condition is configured, the custom claim will always be added.
type: CustomContextDataStringClaim
id: CustomContextDataStringClaim-xxxxxx
displayName:
comment:
properties:
claimCondition:
claimName:
contextDataName:
Context Data Uniqueness Check
contextDataKey) behaviour) - IGNORE_ATTRIBUTE: The violating context field is ignored, and the import proceeds with the next context fields of the user. Note: If the field is also required through "Required User Info Attributes" the current user is ignored instead.
- IGNORE_USER: The current user is ignored, and the import proceeds with data for the next user.
- ABORT: The current user is ignored and the import is aborted. The changes of previous import commands are not rolled back.
type: ContextDataUniquenessCheck
id: ContextDataUniquenessCheck-xxxxxx
displayName:
comment:
properties:
behaviour:
contextDataKey:
Context Data User Group Condition
groupName) contextPropertyName) pattern)
type: ContextDataUserGroupCondition
id: ContextDataUserGroupCondition-xxxxxx
displayName:
comment:
properties:
contextPropertyName:
groupName:
pattern:
Context Data User Validator
contextField) allowedValues)
type: ContextDataUserValidator
id: ContextDataUserValidator-xxxxxx
displayName:
comment:
properties:
allowedValues:
contextField:
Context Data Username
contextData) To be able obtain the context data value, it is required to add an 'OAuth 2.0 Remote Context Data Resource' with a 'Local Context Data Key' equal to this value to the resource mappings.
type: ContextDataUsername
id: ContextDataUsername-xxxxxx
displayName:
comment:
properties:
contextData:
Context Data Username Provider
propertyName) mandatory)
type: ContextDataUsernameProvider
id: ContextDataUsernameProvider-xxxxxx
displayName:
comment:
properties:
mandatory: false
propertyName:
Context Data Username Transformer
userStore) contextDataColumns) Note that at least one context data column must be stated for the transformation to be successful.
checkUserStoreFirst) Usually, setting this property to false is not recommended, as it is often the best strategy to first match for the user ID.
Disabling this check makes sense in a chain of UsernameTransformers where it is known that the current input name cannot be a user ID, e.g. directly after a Primary Key Lookup.
mandatoryTransformation) This transformer serves two main purposes: It can allow login using an 'alias' in addition to the user ID (in this case, set this property to false because this transformer may or may not be given the alias) or it can transform the entered user name on the fly to an 'internal identifier' used for further processing (in this case, set this property to true). In the latter case, this 'internal identifier' cannot be used directly as a login name, thus the transformation must succeed in order to obtain a valid userid for further processing.
Note that a transformation is considered successful if the user name could be resolved, no matter whether or not the user name was actually changed (e.g. the transformation is also successful if the 'Check User Persister First' flag is true and the user name was found using that persister directly).
stopAfterSuccessfulTransformation)
type: ContextDataUsernameTransformer
id: ContextDataUsernameTransformer-xxxxxx
displayName:
comment:
properties:
checkUserStoreFirst: true
contextDataColumns:
mandatoryTransformation: false
stopAfterSuccessfulTransformation: false
userStore:
Context Pattern
pattern) The matching is done against the part of the request URI after the protocol or after the host (depending on the configuration of the context extractor).
Example: If the request URL is "https://host/blah/blue", the considered path is either "host/blah/blue" (if virtualhost is included) or "/blah/blue" otherwise.
The request path is then matched against the regular expression which must match the entire path, not just a substring.
Important: For SPA URLs under /ui/app/*, only top-level navigation (for example when navigating from an external site using a link or http redirect) can be used for context extraction. Most navigations/clicks within the SPA do not lead to an explicit request to the URL seen in the URL bar.
configurationContext) Use "[DEFAULT]" to explicitly return the default context.
type: ContextPattern
id: ContextPattern-xxxxxx
displayName:
comment:
properties:
configurationContext:
pattern:
Cookie Mapping
sourceAccessCookieName) targetAccessCookieName) targetAccessCookiePath) If the same access cookie is used for all applications, the value "/" can be used. If different tickets are used for different applications, the applications path should be used.
Note that only one access cookie per cookie path and name can exist. Make sure that this cookie name does not clash with other cookie's names. For example, do not use session cookie names such as "JSESSIONID".
Make sure the configuration flag Interpret Cookie Domains is set in the Airlock Gateway (WAF) configuration. If not the cookie path is ignored and cookies in the cookie store are sent to any backend HTTP request of the same session. This also means that there may be only one cookie per cookie name!
It is best to consult the corresponding documentation of the web entry server or reverse proxy to get more accurate information on cookie handling.
targetAccessCookieDomain) Because of security restrictions in browsers (same origin policy) it is usually not possible to set a cookie for a different domain unless the right-most two domain parts (e.g. "ergon.ch") are equal to that of the application setting the cookie.
It is possible that there are further restrictions regarding this in browsers.
If you are using a HTTP reverse proxy that stores the cookie in its session store (and does not send it to the client), make sure to understand the proxies interpretation of the cookie domain and cookie path.
Make sure the configuration flag Interpret Cookie Domains is set in the Airlock Gateway (WAF) configuration. If not the cookie domain is ignored and cookies in the cookie store are sent to any backend HTTP request of the same session. The cookie path is also ignored meaning that there may be only one cookie per cookie name!
The Airlock Gateway also supports the following cookie domain values (if the flag Interpret Cookie Domains is set):
- The value
.*results in cookies being sent to all backend servers. This is especially useful if one authentication ticket is used for multiple backends. - The value
@<fully-qualified-host>results in the cookie being treated as if it were set by the host specified by "<fully-qualified-host>". If using this value, make sure the corresponding mapping also uses the fully qualified hostname.
Note that only one cookie per cookie path and name can exist. Make sure that this cookie name does not clash with other cookie's names. For example, do not use session cookie names such as "JSESSIONID".
setSecureFlagTargetAccessCookie) If the cookie is marked as secure, the browser (and any HTTP proxy behaving like a browser) should send the cookie only over secure connections.
Caution: If you think that setting this flag makes your application more secure, it is in most cases way better to adequately secure the access cookie by encrypting it appropriately. Remember that this flag just "asks" the browser to not transmit the cookie over unencrypted connections.
urlEncodeTargetCookieValue) mandatory)
type: CookieMapping
id: CookieMapping-xxxxxx
displayName:
comment:
properties:
mandatory: true
setSecureFlagTargetAccessCookie: false
sourceAccessCookieName:
targetAccessCookieDomain:
targetAccessCookieName:
targetAccessCookiePath: /
urlEncodeTargetCookieValue: false
Cookie Ticket Adder
cookieName) The name of the cookie used to transport the ticket.
Only one cookie per cookie path and name can exist, therefore the name of this cookie must be distinct from all other cookie names used by this applications (such as "JSESSIONID").
cookiePath) The path for which the cookie is set. This determines with which future requests the cookie will be sent to the server.
To add the cookie to all requests to a given domain, the value "/" can be used. If the cookie should be limited to a certain backend, the corresponding context path should be used.
Only one cookie per cookie path and name can exist, therefore the name of this cookie must be distinct from all other cookie for the same path (such as "JSESSIONID").
When using an Airlock Gateway (WAF), the Gateway configuration flag Interpret Cookie Domains must be set. Otherwise the cookie path is ignored and cookies in the cookie store are sent with back-end HTTP requests of the same session.
cookieDomain) Because of security restrictions in browsers (same origin policy) it is usually not possible to set a cookie for a different domain (except subdomains).
Airlock Gateway (WAF) handle cookies differently and allow setting cookies for other domains within the protected infrastructure while not exposing them to the internet. The Gateway configuration flag Interpret Cookie Domains needs to be enabled for this feature. If this flag is enabled, also the following special domain names are supported:
- An empty value results in the cookie only being sent to the origin server that set the cookie.
- The value
.*results in cookies being sent to all back-end servers. - Setting a different hostname results in the cookie being sent to the back-end host with that hostname.
secureFlag) If the cookie is marked as secure, the browser (and any HTTP proxy behaving like a browser) should send the cookie only over secure connections.
type: CookieTicketAdder
id: CookieTicketAdder-xxxxxx
displayName:
comment:
properties:
cookieDomain:
cookieName:
cookiePath: /
secureFlag: true
Cookie Ticket Identity Propagator
This plugin is usually used together with an entry component that keeps the authentication ticket cookie from being sent to the client and therefore from being exposed to external attacks.
If you intend to send the cookie to the client, it must be protected accordingly by choosing an appropriate ticket encoder.
cookieName) Note that only one cookie per cookie path and name can exist. Make sure that this cookie name does not clash with other cookie's names. For example, do not use session cookie names such as "JSESSIONID".
cookiePath) If one single authentication ticket is used for all applications, the value "/" can be used. If different tickets are used for different applications, the applications path should be used.
Note that only one cookie per cookie path and name can exist. Make sure that this cookie name does not clash with other cookie's names. For example, do not use session cookie names such as "JSESSIONID".
Make sure the configuration flag Interpret Cookie Domains is set in the Airlock Gateway (WAF) configuration. If not, the cookie path is ignored and cookies in the cookie store are sent to any back-end HTTP request of the same session. This also means that there may be only one cookie per cookie name!
It is best to consult the corresponding documentation of the web entry server or reverse proxy to get more accurate information on cookie handling.
cookieDomain) Because of security restrictions in browsers (same origin policy) it is usually not possible to set a cookie for a different domain unless the right-most two domain parts (e.g. "ergon.ch") are equal to that of the application setting the cookie.
It is possible that there are further restrictions regarding this in browsers.
If you are using a HTTP reverse proxy that stores the cookie in its session store (and does not send it to the client), make sure to understand the proxies interpretation of the cookie domain and cookie path.
Make sure the configuration flag Interpret Cookie Domains is set in the Airlock Gateway (WAF) configuration. If not, the cookie domain is ignored and cookies in the cookie store are sent to any back-end HTTP request of the same session. The cookie path is also ignored, meaning that there may be only one cookie per cookie name!
Airlock also supports the following cookie domain values (if the flag Interpret Cookie Domains is set):
- An empty value results in the cookie only being sent to the origin server that set the cookie.
- The value
.*results in cookies being sent to all back-end servers. This is especially useful if one authentication ticket is used for multiple back-ends. - The value
@<fully-qualified-host>results in the cookie being treated as if it were set by the host specified by "<fully-qualified-host>". If using this value, make sure the corresponding mapping also uses the fully qualified hostname.
If one single authentication ticket is used for all applications, the value ".*" can be used. If different tickets are used for different applications, the applications path should be used.
ticketService) ticketEncoder) Caution:This plugin is usually used together with an entry component that keeps the authentication ticket cookie from being sent to the client and therefore from being exposed to external attacks.
If you intend to send the cookie to the client, it must be protected accordingly by choosing an appropriate ticket encoder.
Note that some ticket encoders do not support ticket expiry, i.e. they do not encode the ticket validity into the ticket.
keyValuePairs) If supported by the ticket service plugin, this is a way to add such an extra key-value-pair to a ticket.
The key-value-pairs are added to the key-value-pairs passed to this plugin by the calling application. It overwrites existing values with the same key.
urlEncodingScheme) Make sure that the component receiving the ticket uses the same URL encoding scheme.
disableUrlEncoding) true, the cookie's final value is not URL-encoded, though the key/values will always be.
Notice that this may result in V1 cookies because the value will most probably contain the '=' character which is not allowed in V0 cookies. Make sure your application supports V1 cookies when disabling this property.
setSecureFlagInCookie) If the cookie is marked as secure, the browser (and any HTTP proxy behaving like a browser) should send the cookie only over secure connections.
Caution: If you think that setting this flag makes your application more secure, it is in most cases way better to adequately secure the authentication ticket by choosing a secure ticket encoder plugin. Remember that this flag just "asks" the browser to not transmit the cookie over unencrypted connections.
type: CookieTicketIdentityPropagator
id: CookieTicketIdentityPropagator-xxxxxx
displayName:
comment:
properties:
cookieDomain:
cookieName:
cookiePath: /
disableUrlEncoding: false
keyValuePairs:
setSecureFlagInCookie: false
ticketEncoder:
ticketService:
urlEncodingScheme: UTF-8
Correlation ID Settings
headerName) validationPattern) The correlation ID that is extracted from the request header will be matched against this regular expression.
If it matches, then it will be logged for the scope of the current HTTP request. Otherwise, the value is rejected, and no correlation ID will be logged.
This can be configured to prevent unexpected values from being written to the log files.
type: CorrelationIdSettings
id: CorrelationIdSettings-xxxxxx
displayName:
comment:
properties:
headerName: X-Correlation-ID
validationPattern: [\x21-\x7E]{2,256}
CORS Settings
allowedOrigins) A list of regular expressions for the origins allowed to execute cross domain requests ('preflight checks') to the REST API. If no origins are configured, the server will deny any CORS requests.
Note that if a TLS tunnel is terminated by a load balancer which connects to IAM via http, IAM will consider most requests as CORS requests unless 'Strict CORS Validation' is deactivated.
strictCorsValidation) Match the 'Origin' header of the browser exactly.
Disabling this flag allows Airlock IAM to be connected to e.g. a load-balancer without TLS (load-balancer terminates TLS):
- 'https://yourhost.com:443' is then considered a match compared to 'http://yourhost.com:80', and treated as same-origin
Note that this setting does not influence the 'Allowed Origins'.
type: CorsSettings
id: CorsSettings-xxxxxx
displayName:
comment:
properties:
allowedOrigins:
strictCorsValidation: true
Create Airlock 2FA Device Activation Letters
Settings for user's device activation letters. Such a letter contains a QR code to be scanned and is typically necessary for the registration of the first Airlock 2FA device.
Note that once the letter is generated, Airlock IAM is no longer involved in the activation of a user's device. This implies in particular, that a user who has been locked out after the generation of an activation letter could still use it to successfully register an Airlock 2FA device. Login will of course remain impossible as long the user is locked out.
Compared to "Order Airlock 2FA Device Activation Letters", no order will be created since activation letters will be directly generated by this plugin. The "Airlock 2FA Activation Letter Order Task" is therefore not necessary in this case.
letterPrintingOptions) enrollmentValidityInSeconds) Note: This value is only used for the validity of the QR code in the enrollment letter and does not affect enrollment self-services.
type: Airlock2FACreateActivationLetters
id: Airlock2FACreateActivationLetters-xxxxxx
displayName:
comment:
properties:
enrollmentValidityInSeconds: 604800
letterPrintingOptions:
Create Airlock 2FA Hardware Token Shipment Letters
renderer) The following placeholders can be used in the templates
${User Context Data Name}- context data of the user.${deviceManufacturer}- manufacturer of device.${deviceModel}- model of device.${deviceSerialNumber}- serial number of device.${deviceActivationCode}- activation code of device, if any.
workingDirectory) If this property is defined, shipment letters are not directly generated into the output directory (see other property) but they are generated into this working directory and are then moved into the output directory once they are done.
This helps to solve problems with processes that automatically read the rendered letters and therefore might not see the fully rendered result. Make sure that the working directory and the output directory reside in the same file system (otherwise the moving of the generated file will not be atomic).
The directory is either absolute or relative to the JVMs current directory.
outputDirectory) languageContextDataName)
type: Airlock2FAShipmentLetters
id: Airlock2FAShipmentLetters-xxxxxx
displayName:
comment:
properties:
languageContextDataName:
outputDirectory:
renderer:
workingDirectory:
Credential Data Certificate Matcher
In a first step, a user identifier is extracted from the certificate data (e.g. from the subject DN). The result can either be used directly as username, or additionally, a User Iterator is configured to match the extracted identifier against some user attribute. If a matching user is found, its username is returned.
Example:A certificate contains the following DN:
cn=test,ou=local,o=company,c=ch.The matcher can be configured (without User Iterator) to match the CN as user attribute, therefore, the extracted username is "test".
userAttribute) The following value is treated specially:
- "altSubjectName": Use the certificate's alternative subject name as username.
usernameTransformer) userIterator) contextDataColumns)
type: CredentialDataCertificateMatcher
id: CredentialDataCertificateMatcher-xxxxxx
displayName:
comment:
properties:
contextDataColumns:
userAttribute:
userIterator:
usernameTransformer:
Credential Data mTAN Handler
credentialPersister) perUserFlashContextField) If a context data field is configured, sending of flash messages is decided per user, based on the value in this field. If this field is empty, the default flash setting is used.
Important: The referenced context data field must be of type String and accepts only one of the following values:
true- send flash SMSfalse- send normal SMS<empty/null>- use the default flash settings
Note: The same configuration value must also be added to the credential persister's context data fields.
iakVerifier) The IAK verifier is used to check initial activation keys. It is only used during credential self-registration and not during credential self-migration.
CAUTION: Not specifying an IAK verifier plugin means that no IAK is checked during the self-registration process. Be careful to not create unsafe processes! Usually, self-registration is unsafe without IAK verification.
iakGenerator) iakHashFunction) NOTE: Some password hashes, such as SHA 256 Password Hash or Scrypt Password Hash, produce binary output. If one of these is used, make sure the persistence layer supports binary data in the hash field and the corresponding persistence plugins (e.g. Database User Store or Ldap Connector) are configured to treat hash values as binary values.
In case the persistence layer expects a string, encode the password hash by wrapping it with an encoder. To achieve this, use the Password Hash Configuration plugin and specify the hash function (such as Scrypt Password Hash) together with the desired encoder. We recommend using the Base64 Password Hash Encoder.
hashValueIsBinary) iakCredentialPersister)
type: CredentialDataMtanHandler
id: CredentialDataMtanHandler-xxxxxx
displayName:
comment:
properties:
credentialPersister:
hashValueIsBinary: false
iakCredentialPersister:
iakGenerator:
iakHashFunction:
iakVerifier:
perUserFlashContextField:
Credential Report Task
The task uses a user iterator plug-in to go through the set of users or credential records and looks at a specific flag telling this plug-in that a report should be rendered for the user (or credential). If the flag is set, the "delivery security gap" is checked: This is the minimum amount of time there must be between two reports being generated for one and the same user. If this check is ok, the configured report renderer is called and the flag reset.
Note:: There are special tasks for generating password letters (reportTypeShortDesc) The text is used in the user trail log written when a report is rendered. Please specify a text like in the examples below, so it suits the structure of the log statement it is used in.
If this property is not specified, a general statement will be logged.
credentialPersister) credentialIterator) reportRenderer) deliverySecurityGap) This feature only works correct, if the underlying credential persister knows about the other credentials delivery timestamps. Make sure these are properly configured for the credential persister.
Not setting this property turns this feature off.
languageAttributeName) workingDirectory) If this property is defined, the credential reports are not directly generated into the output directory (see other property) but they are generated into this working directory and are moved to the output directory once they are done.
This helps to solve problems with processes automatically reading the rendered reports and reading partial reports during the generation process. Make sure that the working directory and the output directory reside in the same file system (if not the moving of the generated file will not be atomic).
The directory is either absolute or relative to the JVMs current directory.
outputDirectory) This property is not required if the renderer plugin (see separate property) does not write on the outputstream (e.g. sends it somewhere else). It is required otherwise.
Note: If this property is not defined and the used renderer plugin writes on the output stream, then the result (e.g. a PDF file) is lost.
fileNamePrefix) Do not use the prefix "pwd-" or the empty prefix if password- or tokenlist reports are stored in the same directory. The latter is used as default for token lists (matrix card) and the former for password letters.
fileNameSuffix) deleteOldReports) Caution: This feature will delete all reports starting with the prefix configured by property "file-name-prefix" and the user's name. Thus you must make sure, that different report types use different filename prefixes.
type: CredentialReportTask
id: CredentialReportTask-xxxxxx
displayName:
comment:
properties:
credentialIterator:
credentialPersister:
deleteOldReports: false
deliverySecurityGap: 0
fileNamePrefix:
fileNameSuffix:
languageAttributeName:
outputDirectory:
reportRenderer:
reportTypeShortDesc:
workingDirectory:
Credential Secret Batch Task
Unlike the "Password Batch Task" this plugin uses a credential persister / iterator.
Generated secrets are rendered (e.g. made a pdf or printed) using a
credentialIterator) credentialPersister) deliverySecurityGapDays) Setting this property to zero (0) disables this feature.
aggregateReport) credentialSecretGenerator) tokenCleanupConfigs)
type: CredentialSecretBatchTask
id: CredentialSecretBatchTask-xxxxxx
displayName:
comment:
properties:
aggregateReport:
credentialIterator:
credentialPersister:
credentialSecretGenerator:
deliverySecurityGapDays: 0
tokenCleanupConfigs:
Credential Secret Generator
hashValueIsBinary) passwordGenerator) hashFunctionPlugin) NOTE: Some password hashes, such as SHA 256 Password Hash or Scrypt Password Hash, produce binary output. If one of these is used, make sure the persistence layer supports binary data in the hash field and the corresponding persistence plugins (e.g. Database User Store or Ldap Connector) are configured to treat hash values as binary values.
In case the persistence layer expects a string, encode the password hash by wrapping it with an encoder. To achieve this, use the Password Hash Configuration plugin and specify the hash function (such as Scrypt Password Hash) together with the desired encoder. We recommend using the Base64 Password Hash Encoder.
outputDirectoryPath) This property is not required if the renderer plugin (see separate property) does not write on the outputstream (e.g. sends it somewhere else). It is required otherwise.
Note: If this property is not defined and the used renderer plugin writes on the output stream, then the result (e.g. a PDF file) is lost.
workingDirectoryPath) If this property is defined, the passwords are not directly generated into the output directory (see other property) but they are generated into this working directory and are moved to the output directory once they are done.
This helps to solve problems with processes automatically reading the rendered passwords and reading partial reports during the generation process. Make sure that the working directory and the output directory reside in the same file system (if not the moving of the generated file will not be atomic).
The directory is either absolute or relative to the JVMs current directory.
fileNamePrefix) Do not use the empty prefixes if token-list reports are stored in the same directory. The empty prefix is the default for token list letters (and not configurable in older plugin versions).
This property is optional to be backwards compatible. The prefix "pwd-" is used if none is defined.
configuredFileNameSuffix) reportTypeShortDesc) The text is used in the user trail log written when a report is rendered. Please specify a text like in the examples below, so it suits the structure of the log statement it is used in.
If this property is not specified, a general statement will be logged.
passwordRenderer) languageAttributeName) deleteOldPasswords) barcodeGenerator) - BarcodeImage: placeholder for the barcode image.
- BarcodeContent: placeholder for the barcode content.
- BarcodeContentDisplay: placeholder for the barcode content in a human-readable format.
type: CredentialSecretGenerator
id: CredentialSecretGenerator-xxxxxx
displayName:
comment:
properties:
barcodeGenerator:
configuredFileNameSuffix:
deleteOldPasswords: false
fileNamePrefix: pwd-
hashFunctionPlugin:
hashValueIsBinary: false
languageAttributeName:
outputDirectoryPath:
passwordGenerator:
passwordRenderer:
reportTypeShortDesc:
workingDirectoryPath:
Credential to Authenticator Mapping
pattern) Defines a regular expression pattern matched against the credential (token or response to a challenge or password) provided during authentication.
caseSensitive) false, the case of characters is ignored when matching the pattern against the credential data. authenticator)
type: CredentialBasedAuthenticatorSelectorMapping
id: CredentialBasedAuthenticatorSelectorMapping-xxxxxx
displayName:
comment:
properties:
authenticator:
caseSensitive: true
pattern:
Credential-based Attribute Mapping
This plugin is designed to work only with the credential-based repository that is shipped with IAM. For custom repository implementations, custom attribute mappings are needed.
serialNumber) enabled) validFrom) validTo) generationDate) data) encoding) deliveryDate) contextDataFields) Mapped context data fields are elements of a nested map with the name 'contextData'. For example an entry with external name 'myField' will be mapped to an external interface as data.attributes.contextData.myField.
type: CredentialBasedAttributeMapping
id: CredentialBasedAttributeMapping-xxxxxx
displayName:
comment:
properties:
contextDataFields:
data:
deliveryDate:
enabled:
encoding:
generationDate:
serialNumber:
validFrom:
validTo:
Credential-based Authenticator Selector
An authenticator plugin that selects one of several authenticators (and/or contexts) depending on the credential provided in the first or any preceding authentication steps: The credential, i.e. the token or response to a challenge or the password, is compared against a list of regular expressions. The first matching expression defines the authenticator plugin (and/or context) to use for the rest of the authentication process. If none matches, a default authenticator is used.
This plugin does not add or change data added to the authentication result but just passes on the results of the wrapped authenticator(s).
Example usage:
- Use the plugin as second authenticator after username and password have been provided.
- Configure it with an SmsAuthenticator as default authenticator and an EmailOtpAuthenticator used if the token matches "email"
- The user is then asked for an SMS code after successful password verification. If the user enters "email" as SMS code, an email is sent and the user is asked for the OTP in the email.
mappings) defaultAuthenticator)
type: CredentialBasedAuthenticatorSelector
id: CredentialBasedAuthenticatorSelector-xxxxxx
displayName:
comment:
properties:
defaultAuthenticator:
mappings:
Credential-based Generic Token Repository
Repository that loads credentials as tokens from persistence.
If configured, the credential model supports a 'current' and 'next' credential. The db columns can be specified in the configured 'Credential Persister'.credentialPersister) supportCurrentAndNextCredential) useNextAsCurrentOnDeletion) attributeMapping)
type: CredentialBasedGenericTokenRepository
id: CredentialBasedGenericTokenRepository-xxxxxx
displayName:
comment:
properties:
attributeMapping:
credentialPersister:
supportCurrentAndNextCredential: false
useNextAsCurrentOnDeletion: true
CRL Certificate Status Checker
Periodically updates the CRL using the configured "CRL Fetcher". The latest fetched CRL is cached in memory and if configured, persisted into a file cache.
The CRL Distribution Point Extension of the certificate is not taken into account. Use plugin "CRL Distribution Point Extension CRL Checker" to consider the CRL Distribution Point Extension of the certificate being checked.
crlFetcher) fetchIntervalSeconds) If the CRL cannot be fetched, a warning is logged and the plug-in tries again after the waiting some time specified by property
retry-interval-seconds. retryIntervalSeconds) retryCount) retry-interval-seconds. This property specifies the maximum number of retries before the plug-in gives up. After giving up, the plug-in will try again after the normal fetch interval (specified by property fetch-interval-seconds has been passed.
The number of retries times the amount of time to wait between retries must not be greater than the fetch interval.
crlValiditySeconds) Make sure that the validity period is considerably larger than the fetch interval.
The minimum value is one minute (60).
failSilentlyIfCrlExpired) If set to
TRUE, calling method isRevoked(X509Certificate) always returns true and a warning is logged.
If set to
FALSE (the default), calling method isRevoked(X509Certificate) will result in a CertificateStatusCheckerException. cacheFile) This property is optional. If not defined, no local file cache will be used.
Caution:Make sure the file is readable and writable. Be careful with relative paths and permissions.
includedIssuer) keystoreConfig)
type: CrlCertificateStatusChecker
id: CrlCertificateStatusChecker-xxxxxx
displayName:
comment:
properties:
cacheFile:
crlFetcher:
crlValiditySeconds:
failSilentlyIfCrlExpired: false
fetchIntervalSeconds:
includedIssuer:
keystoreConfig:
retryCount:
retryIntervalSeconds:
CRL Distribution Point Extension CRL Checker
crlObtainer) fallbackChecker) eagerlyLoadedURLs) keystoreConfig) factory) cacheRefreshInterval)
type: MultiIssuerCRLChecker
id: MultiIssuerCRLChecker-xxxxxx
displayName:
comment:
properties:
cacheRefreshInterval: 1
crlObtainer:
eagerlyLoadedURLs:
factory:
fallbackChecker:
keystoreConfig:
CRL HTTP Obtainer
overwriteURL) factory) basicAuthUsername) basic-auth-password. basicAuthPassword) basic-auth-username. proxyHost) proxyPort) proxyLoginUser) proxyLoginPassword) allowOnlyTrustedCerts) Only allow connections to servers whose certificate is trusted. See documentation of property "Trust Store Path" for more information about what certificates are trusted.
Security warning: Trusting all certificates allows connections to adversarial hosts. Only disable this property for testing and integration setups.
verifyServerHostname) Enables hostname verification, i.e. the actual hostname must be the same as in the server certificate.
Security warning: Not verifying the hostname may allow connections to adversarial hosts, e.g. if they employ DNS spoofing. Only disable this property for testing and integration setups.
trustStorePath) If this property is not defined the following certificate issuers are trusted:
- The list of issuers known to the Java VM if the system property "javax.net.ssl.trustStore" is not defined.
- The list of issuers in a keystore referenced by system property "javax.net.ssl.trustStore" if defined in instance.properties using iam.java.opts
If this property is defined then the following certificate issuers are trusted:
- The list of issuers in the referenced truststore file and no others.
This property is only relevant if the property "Allow Only Trusted Certs" is enabled.
trustStoreType) trustStorePassword) Depending on the keystore type, leaving this property empty (or undefined) has a different effect:
- JKS: the keystore can be opened and used but the integrity of the keystore is not checked.
- PKCS12: an error occurs.
connectTimeout) correlationIdHeaderName) When configured, all requests sent contain a header with the correlation ID with the configured name. If no value or an empty value is specified, the correlation ID header is not sent.
If the correlation ID is not defined, the correlation ID header is not included in sent requests.
type: CrlHTTPObtainer
id: CrlHTTPObtainer-xxxxxx
displayName:
comment:
properties:
allowOnlyTrustedCerts: true
basicAuthPassword:
basicAuthUsername:
connectTimeout: 5
correlationIdHeaderName:
factory:
overwriteURL:
proxyHost:
proxyLoginPassword:
proxyLoginUser:
proxyPort:
trustStorePassword:
trustStorePath:
trustStoreType: JKS
verifyServerHostname: true
Cronto Activation Possible
crontoHandler) strongAuthenticationTag)
type: CrontoActivationPossibleCondition
id: CrontoActivationPossibleCondition-xxxxxx
displayName:
comment:
properties:
crontoHandler:
strongAuthenticationTag:
Cronto Activation Required
crontoHandler) includeInactiveDevices) strongAuthenticationTag)
type: CrontoActivationRequiredCondition
id: CrontoActivationRequiredCondition-xxxxxx
displayName:
comment:
properties:
crontoHandler:
includeInactiveDevices: false
strongAuthenticationTag:
Cronto Activation Step
crontoHandler) authenticationMethodId) Example: a system tracks two passwords per user. Password 1 is used in flow A, password 2 in flow B. These two steps must have distinct 'Authentication Method Ids', e.g. PASSWORD1 and PASSWORD2.
If only one identifier (e.g. "PASSWORD") is used, this may allow brute force attacks on the password as follows. Assuming an attacker knows the user's password 1, they get an unlimited number of attempts on flow B, as the 'PASSWORD' counter can repeatedly be reset to 0 by performing a successful login on flow A.To prevent such attacks, use two different counters by setting the authentication methods, for example, to PASSWORD1 and PASSWORD2, respectively.
strongAuthenticationTag) If configured, this tag indicates strong authentication (typically two factors) and thus enables Cronto on-screen activation. The configured tag has to be obtained by an authentication step. In addition, the property "Enable On-Screen Activation" on the Cronto Handler must be enabled and all described conditions of the property must be fulfilled. This feature is typically used for migration use cases.
For security reasons, it is important to configure a strong authentication tag.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: CrontoActivationStep
id: CrontoActivationStep-xxxxxx
displayName:
comment:
properties:
authenticationMethodId: CRONTO
crontoHandler:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
strongAuthenticationTag:
tagsOnSuccess:
Cronto Approval Stealth Step
Cronto approval stealth step for public self-service flows.
This step displays a random dummy Cronto cryptogram and classifies any response OTP as wrong. Thus, it can never be successfully completed. It is intended to be used to avoid information leaking about users. Externally it behaves like the real Cronto approval step for public self-service flows.
This step is needed if the Cronto approval is used instead of a user verification step. Because the real Cronto approval step cannot be used for nonexistent or otherwise invalid users, a selection must be configured, using the "Public Self-Service Allowed Condition" to ensure that only users that are allowed to do public self-services enter the real Cronto step, while the other users end up in the stealth step.
Note that push and online validation have to be disabled in the real Cronto step, otherwise information would be leaked because it could behave differently for existing users (e.g. show push device selection). The configured authentication method ID must be the same as that of the real Cronto step. Also make sure the configured Flow Processors and Flow Restrictions in the public self-service flow allow nonexistent users and do not provide user feedback.
crontoHandler) Handles all Cronto-specific actions.
When the Cronto app communicates directly to IAM (for online validation and push notification management) these requests are on a separate session and must therefore be handled by a separate, global Cronto Handler defined in "Cronto App Communication" in Loginapp.
authenticationMethodId) Example: a system tracks two passwords per user. Password 1 is used in flow A, password 2 in flow B. These two steps must have distinct 'Authentication Method Ids', e.g. PASSWORD1 and PASSWORD2.
If only one identifier (e.g. "PASSWORD") is used, this may allow brute force attacks on the password as follows. Assuming an attacker knows the user's password 1, they get an unlimited number of attempts on flow B, as the 'PASSWORD' counter can repeatedly be reset to 0 by performing a successful login on flow A.To prevent such attacks, use two different counters by setting the authentication methods, for example, to PASSWORD1 and PASSWORD2, respectively.
maxResponseRetries) The number of times the user may enter a wrong response before the flow is aborted (and the challenge is deleted). If set to 0, only 1 attempt is possible for each challenge.
The purpose of this settings is usability. The failed attempts counter is always increased upon receiving a wrong OTP and the user is locked when the global failed attempts limit is exceeded.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: CrontoPublicSelfServiceApprovalStealthStep
id: CrontoPublicSelfServiceApprovalStealthStep-xxxxxx
displayName:
comment:
properties:
authenticationMethodId: CRONTO
crontoHandler:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
maxResponseRetries: 3
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Cronto Authentication Step
authenticatePushDevicesOnly) If this flag is set and there is no push-enabled device for the user, authentication is not possible.
This feature may be used for mobile application logins, where showing a cryptogram on the same device is not appropriate.
pushSelectionForSingleDevice) showLoginIdOnPush) If this flag is set a random ID is generated and shown to the user during push login.
The ID is shown on the Cronto device with the push message and on the login page, allowing the user to correlate a push message with a login session.
messageProvider) crontoHandler) Handles all Cronto-specific actions.
When the Cronto app communicates directly to IAM (for online validation and push notification management) these requests are on a separate session and must therefore be handled by a separate, global Cronto Handler defined in "Cronto App Communication" in Loginapp.
authenticationMethodId) Example: a system tracks two passwords per user. Password 1 is used in flow A, password 2 in flow B. These two steps must have distinct 'Authentication Method Ids', e.g. PASSWORD1 and PASSWORD2.
If only one identifier (e.g. "PASSWORD") is used, this may allow brute force attacks on the password as follows. Assuming an attacker knows the user's password 1, they get an unlimited number of attempts on flow B, as the 'PASSWORD' counter can repeatedly be reset to 0 by performing a successful login on flow A.To prevent such attacks, use two different counters by setting the authentication methods, for example, to PASSWORD1 and PASSWORD2, respectively.
maxResponseRetries) The number of times the user may enter a wrong response before the flow is aborted (and the challenge is deleted). If set to 0, only 1 attempt is possible for each challenge.
The purpose of this settings is usability. The failed attempts counter is always increased upon receiving a wrong OTP and the user is locked when the global failed attempts limit is exceeded.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: CrontoAuthStep
id: CrontoAuthStep-xxxxxx
displayName:
comment:
properties:
authenticatePushDevicesOnly: false
authenticationMethodId: CRONTO
crontoHandler:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
maxResponseRetries: 3
messageProvider:
onFailureGotos:
preCondition:
pushSelectionForSingleDevice: false
requiresActivation: false
showLoginIdOnPush: false
skipCondition:
stepId:
tagsOnSuccess:
Cronto Challenge Token Cleanup Strategy
tokenDataProvider) secondsToKeepChallengeToken)
type: CrontoChallengeTokenCleanUpStrategy
id: CrontoChallengeTokenCleanUpStrategy-xxxxxx
displayName:
comment:
properties:
secondsToKeepChallengeToken: 300
tokenDataProvider:
Cronto Device Activated
type: CrontoDeviceActivatedSubscribedEvent
id: CrontoDeviceActivatedSubscribedEvent-xxxxxx
displayName:
comment:
properties:
Cronto Device Deleted
type: CrontoDeviceDeletedSubscribedEvent
id: CrontoDeviceDeletedSubscribedEvent-xxxxxx
displayName:
comment:
properties:
Cronto Device List
crontoHandler) accessCondition) Precondition that must be fulfilled for a user to access the Cronto device list.
Note the difference to the "Authorization Condition":- Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
authorizationCondition) - Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
type: CrontoDeviceListSelfServiceRest
id: CrontoDeviceListSelfServiceRest-xxxxxx
displayName:
comment:
properties:
accessCondition:
authorizationCondition:
crontoHandler:
Cronto Device Management UI
Depending on the configuration, the user interface allows an authenticated user:
- to activate a new Cronto device.
- to order a new Cronto device activation letter.
- to delete a Cronto device.
- to rename a Cronto device.
- to enable a Cronto device.
- to disable a Cronto device.
- to enable push for a Cronto device.
- to disable push for a Cronto device.
The Cronto device management interface is accessible at /<loginapp-uri>/ui/app/protected/tokens/cronto/devices after user authentication.
flowToActivateDevice) flowToOrderActivationLetter) flowToDeleteDevice) flowToRenameDevice) flowToEnableDevice) flowToDisableDevice) flowToEnablePush) flowToDisablePush) pageExitTarget) If configured, an additional button is displayed on the Cronto device management to exit the page. On click, this button redirects the user to the configured target.
To redirect to a target application, redirect to the corresponding "Authentication Flow". If the flow can be skipped due to the obtained tags, the user is directly forwarded to the target application.
type: CrontoDeviceManagementUi
id: CrontoDeviceManagementUi-xxxxxx
displayName:
comment:
properties:
flowToActivateDevice:
flowToDeleteDevice:
flowToDisableDevice:
flowToDisablePush:
flowToEnableDevice:
flowToEnablePush:
flowToOrderActivationLetter:
flowToRenameDevice:
pageExitTarget:
Cronto Device Management UI Redirect
type: CrontoDeviceManagementFlowRedirectTarget
id: CrontoDeviceManagementFlowRedirectTarget-xxxxxx
displayName:
comment:
properties:
Cronto Device Removal Possible
crontoHandler) allowDeletingLastDevice)
type: CrontoDeviceDeletionPossibleCondition
id: CrontoDeviceDeletionPossibleCondition-xxxxxx
displayName:
comment:
properties:
allowDeletingLastDevice: false
crontoHandler:
Cronto Device Reset Step
crontoHandler) removeAccount) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: CrontoDeviceResetStep
id: CrontoDeviceResetStep-xxxxxx
displayName:
comment:
properties:
crontoHandler:
customFailureResponseAttributes:
customResponseAttributes:
onFailureGotos:
preCondition:
removeAccount: false
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Cronto Device Selection Step
crontoHandler) interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: CrontoDeviceSelectionStep
id: CrontoDeviceSelectionStep-xxxxxx
displayName:
comment:
properties:
crontoHandler:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Cronto Engine Handler
maximumNumberOfActivatedDevices) defaultAllowedPlatforms) Defines the platforms for which an activation letter can be used per default. This can always be changed by an administrator for an individual letter.
Currently, the following platform codes are supported:
- 0: stand-alone Cronto device
- 1: iOS
- 2: Android
- 3: Windows phone
- 4: Blackberry
- 5: rooted iOS
- 6: rooted Android
platformBlacklist) Blacklist of blocked platform types. If a type is on this list, it can not be used for login or transaction signing and new devices of this type cannot be activated, independent of the allowed platforms in the activation letter.
Currently, the following platform codes are supported:
- 0: stand-alone Cronto device
- 1: iOS
- 2: Android
- 3: Windows phone
- 4: Blackberry
- 5: rooted iOS
- 6: rooted Android
challengeTokenLifetime) enablePushNotifications) bankUrlIndex) pushNotificationsReminderPeriod) serviceCode) pushNotificationSender) tokenDataProvider) defaultNumberOfActivations) Defines how many times an activation letter can be used per default to activate devices or apps. This can always be changed by an administrator for an individual letter.
defaultLetterValidityTime) selectableAsAuthMethod) selectableAsNextAuthMethod) enableOnScreenActivation) On-screen activation is only possible in two situations: (1) during credential migration and (2) when activating an additional device.
Attention: make sure that such an activation can only be accessed by strongly authenticated users. For this, the "Strong Authentication Tag" must be configured on the following plugins (if used):- Cronto Activation Step
- Cronto Activation Possible
- Cronto Activation Required
enableOnScreenActivationWithLetter) Attention: make sure that such an activation can only be accessed by strongly authenticated users (refer to the documentation of "Enable On-Screen Activation")
availableOrderOptions) optionsResourceKeyPrefix) defaultOrderOptions)
type: CrontoEngineHandler
id: CrontoEngineHandler-xxxxxx
displayName:
comment:
properties:
availableOrderOptions: [default]
bankUrlIndex:
challengeTokenLifetime: 300
defaultAllowedPlatforms: 01234
defaultLetterValidityTime:
defaultNumberOfActivations: 8
defaultOrderOptions: [default]
enableOnScreenActivation: false
enableOnScreenActivationWithLetter: false
enablePushNotifications: false
maximumNumberOfActivatedDevices: 8
optionsResourceKeyPrefix: cronto-order-option.
platformBlacklist:
pushNotificationSender:
pushNotificationsReminderPeriod: 3
selectableAsAuthMethod: true
selectableAsNextAuthMethod: true
serviceCode:
tokenDataProvider:
Cronto Legacy Login Message Provider
Provides the same Cronto login message that is created when using the "Cronto Authenticator".
This plugin exists for backward compatibility and uses the translations cronto.login-title, cronto.login-username, cronto.login-last and cronto.login-id to create a login message.
usernameAlias) dateFormat)
type: CrontoLegacyLoginMessageProvider
id: CrontoLegacyLoginMessageProvider-xxxxxx
displayName:
comment:
properties:
dateFormat: dd.MM.yyyy HH:mm
usernameAlias:
Cronto Letter Order Condition
crontoHandler) crontoAccountRequired) crontoLetterRequired) minimalLetterOrderInterval) Number of hours that must at least have passed since the last Cronto activation letter has been ordered.
By setting this value to 0, no waiting time until an additional letter can be ordered is required. However, it is recommended to set a different value to prevent a letter being ordered while another one is still being printed or being delivered.
type: CrontoLetterOrderCondition
id: CrontoLetterOrderCondition-xxxxxx
displayName:
comment:
properties:
crontoAccountRequired: true
crontoHandler:
crontoLetterRequired: false
minimalLetterOrderInterval: 24
Cronto Letter Order Step
crontoHandler) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: CrontoLetterOrderStep
id: CrontoLetterOrderStep-xxxxxx
displayName:
comment:
properties:
crontoHandler:
customFailureResponseAttributes:
customResponseAttributes:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Cronto Letter Ordered
type: CrontoLetterOrderedSubscribedEvent
id: CrontoLetterOrderedSubscribedEvent-xxxxxx
displayName:
comment:
properties:
Cronto Letter User Event Listener
crontoHandler) condition)
type: CrontoLetterUserEventListener
id: CrontoLetterUserEventListener-xxxxxx
displayName:
comment:
properties:
condition:
crontoHandler:
Cronto Message Provider
resourceKey) pushTitleResourceKey) pushSubjectResourceKey) valueProviders) omitEmptyValueLines) crontoHandler)
type: GenericCrontoMessageProvider
id: GenericCrontoMessageProvider-xxxxxx
displayName:
comment:
properties:
crontoHandler:
omitEmptyValueLines: false
pushSubjectResourceKey: cronto.push.login.subject
pushTitleResourceKey: cronto.push.login.title
resourceKey:
valueProviders:
Cronto Public Self-Service Approval Step
Cronto approval step for public self-service flows.
Note that unlike identity verification steps, approval steps require an existing user and cannot prevent username enumeration (no stealth mode). It is therefore important that approval steps are only used after an identity verification step.
messageProvider) allowPushDevicesOnly) If this flag is set and there is no push-enabled device for the user, public self-service is not possible.
This feature may be used for mobile application services, where showing a cryptogram on the same device is not useful.
pushSelectionForSingleDevice) crontoHandler) Handles all Cronto-specific actions.
When the Cronto app communicates directly to IAM (for online validation and push notification management) these requests are on a separate session and must therefore be handled by a separate, global Cronto Handler defined in "Cronto App Communication" in Loginapp.
authenticationMethodId) Example: a system tracks two passwords per user. Password 1 is used in flow A, password 2 in flow B. These two steps must have distinct 'Authentication Method Ids', e.g. PASSWORD1 and PASSWORD2.
If only one identifier (e.g. "PASSWORD") is used, this may allow brute force attacks on the password as follows. Assuming an attacker knows the user's password 1, they get an unlimited number of attempts on flow B, as the 'PASSWORD' counter can repeatedly be reset to 0 by performing a successful login on flow A.To prevent such attacks, use two different counters by setting the authentication methods, for example, to PASSWORD1 and PASSWORD2, respectively.
maxResponseRetries) The number of times the user may enter a wrong response before the flow is aborted (and the challenge is deleted). If set to 0, only 1 attempt is possible for each challenge.
The purpose of this settings is usability. The failed attempts counter is always increased upon receiving a wrong OTP and the user is locked when the global failed attempts limit is exceeded.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: CrontoPublicSelfServiceApprovalStep
id: CrontoPublicSelfServiceApprovalStep-xxxxxx
displayName:
comment:
properties:
allowPushDevicesOnly: false
authenticationMethodId: CRONTO
crontoHandler:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
maxResponseRetries: 3
messageProvider:
onFailureGotos:
preCondition:
pushSelectionForSingleDevice: false
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Cronto Push Notification Sender
Configurations for sending Cronto push notifications.
Settings for Android and iOS are both optional and it is possible to configure only one of them.
IAM must be able to connect to the push servers of Google (fcm.googleapis.com) and Apple (gateway.push.apple.com or gateway.sandbox.push.apple.com). To prevent direct communication of IAM to the push servers, a proxy can be configured (see Advanced Settings).
firebaseServiceAccountJson) Path to the JSON file used to authenticate communication with the Google servers. This file can be obtained from the Firebase Console, or, in case of third-party Cronto apps, from the app developer.
iOsAuthenticationCertificatePath) iOsAuthenticationCertificatePassword) iOsBundleId) iOsUseSandboxGateway) showIosBadge) proxyHost) proxyType) proxyPort) connectionTimeout) maxNumberOfThreads) terminationTimeout)
type: CommonCrontoPushNotificationSender
id: CommonCrontoPushNotificationSender-xxxxxx
displayName:
comment:
properties:
connectionTimeout: 20000
firebaseServiceAccountJson:
iOsAuthenticationCertificatePassword:
iOsAuthenticationCertificatePath:
iOsBundleId: com.vasco.digipass.DIGIPASS
iOsUseSandboxGateway: false
maxNumberOfThreads: 20
proxyHost:
proxyPort: 1080
proxyType: SOCKS
showIosBadge: true
terminationTimeout: 60000
Cronto Report Strategy
crontoHandler) tokenDataProvider) reportTypeShortDesc) The text is used in the user trail log written when a report is rendered. Please specify a text like in the examples below, so it suits the structure of the log statement it is used in.
userStore) reportRenderer) barcodeGenerator) Optional barcode generator. If this property is configured, a barcode image and the corresponding barcode content are added to the parameter map accessible by report templates. The following keys are defined:
- BarcodeImage: placeholder for the barcode image.
- BarcodeContent: placeholder for the barcode content.
- BarcodeContentDisplay: placeholder for the barcode content in a human-readable format.
Tracking ID: If the "tracking ID" field is configured in the token data provider the generated barcode content is automatically stored in the token. This is useful for future reference, e.g., for tracking active shipments.
languageAttributeName) outputDirectory) This property is not required if the renderer plugin (see separate property) does not write on the outputstream (e.g. sends it somewhere else). It is required otherwise.
Note: If this property is not defined and the used renderer plugin writes on the output stream, then the result (e.g. a PDF file) is lost.
workingDirectory) If this property is defined, the credential reports are not directly generated into the output directory (see other property) but they are generated into this working directory and are moved to the output directory once they are done.
This helps to solve problems with processes automatically reading the rendered reports and reading partial reports during the generation process. Make sure that the working directory and the output directory reside in the same file system (if not the moving of the generated file will not be atomic).
The directory is either absolute or relative to the JVMs current directory.
deleteOldReports) Caution: This feature will delete all reports starting with the prefix configured by property "file-name-prefix" and the user's name. Thus you must make sure, that different report types use different filename prefixes.
fileNamePrefix) Do not use the prefix "pwd-" or the empty prefix if password- or tokenlist reports are stored in the same directory. The latter is used as default for token lists (matrix card) and the former for password letters.
fileNameSuffix) aggregateReport) requiredOrderOptions) excludingOrderOptions)
type: CrontoReportStrategy
id: CrontoReportStrategy-xxxxxx
displayName:
comment:
properties:
aggregateReport:
barcodeGenerator:
crontoHandler:
deleteOldReports: false
excludingOrderOptions:
fileNamePrefix:
fileNameSuffix:
languageAttributeName:
outputDirectory:
reportRenderer:
reportTypeShortDesc: UNSPECIFIED
requiredOrderOptions:
tokenDataProvider:
userStore:
workingDirectory:
Cronto Self-Service Approval Step
messageProvider) allowOnlyPushDevices) If this flag is set and there is no push-enabled device for the user, approval is not possible.
This feature may be used for mobile application services, where showing a cryptogram on the same device is not useful.
pushSelectionForSingleDevice) crontoHandler) Handles all Cronto-specific actions.
When the Cronto app communicates directly to IAM (for online validation and push notification management) these requests are on a separate session and must therefore be handled by a separate, global Cronto Handler defined in "Cronto App Communication" in Loginapp.
authenticationMethodId) Example: a system tracks two passwords per user. Password 1 is used in flow A, password 2 in flow B. These two steps must have distinct 'Authentication Method Ids', e.g. PASSWORD1 and PASSWORD2.
If only one identifier (e.g. "PASSWORD") is used, this may allow brute force attacks on the password as follows. Assuming an attacker knows the user's password 1, they get an unlimited number of attempts on flow B, as the 'PASSWORD' counter can repeatedly be reset to 0 by performing a successful login on flow A.To prevent such attacks, use two different counters by setting the authentication methods, for example, to PASSWORD1 and PASSWORD2, respectively.
maxResponseRetries) The number of times the user may enter a wrong response before the flow is aborted (and the challenge is deleted). If set to 0, only 1 attempt is possible for each challenge.
The purpose of this settings is usability. The failed attempts counter is always increased upon receiving a wrong OTP and the user is locked when the global failed attempts limit is exceeded.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: CrontoSelfServiceApprovalStep
id: CrontoSelfServiceApprovalStep-xxxxxx
displayName:
comment:
properties:
allowOnlyPushDevices: false
authenticationMethodId: CRONTO
crontoHandler:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
maxResponseRetries: 3
messageProvider:
onFailureGotos:
preCondition:
pushSelectionForSingleDevice: false
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Cronto Self-Services (Legacy)
crontoHandler) userCanDisableAllDevices) activationSessionLifetime) userCanOrderAdditionalLetter) If this option is activated, users can order an additional activation letter, given they have already received a letter but need a new one.
The letter can be ordered on the activation page and the device management page.
minimalNewLetterIntervalInHours) Number of hours that must at least have passed since the last Cronto activation letter has been ordered. This is only used if "User can order additional letter" is activated.
Note:By setting this value to 0, no waiting time until an additional letter can be ordered is required. However, it is recommended to set a different value to prevent a letter being ordered while another one is still being printed or being delivered.
provideDeactivationChallenge)
type: CrontoSelfServiceRest
id: CrontoSelfServiceRest-xxxxxx
displayName:
comment:
properties:
activationSessionLifetime: 120
crontoHandler:
minimalNewLetterIntervalInHours: 24
provideDeactivationChallenge: true
userCanDisableAllDevices: false
userCanOrderAdditionalLetter: false
Cronto Token Controller
crontoHandler) autoOrder)
type: CrontoTokenController
id: CrontoTokenController-xxxxxx
displayName:
comment:
properties:
autoOrder: false
crontoHandler:
Cronto Token Service
crontoHandler) tokenDataProvider)
type: CrontoTokenService
id: CrontoTokenService-xxxxxx
displayName:
comment:
properties:
crontoHandler:
tokenDataProvider:
Cronto Transaction Approval Step
messageProvider) authenticatePushDevicesOnly) If this flag is set and there is no push-enabled device for the user, transaction approval is not possible.
This feature may be used for mobile application approvals, where showing a cryptogram on the same device is not appropriate.
pushSelectionForSingleDevice) pushToAllDevices) crontoHandler) Handles all Cronto-specific actions.
When the Cronto app communicates directly to IAM (for online validation and push notification management) these requests are on a separate session and must therefore be handled by a separate, global Cronto Handler defined in "Cronto App Communication" in Loginapp.
authenticationMethodId) Example: a system tracks two passwords per user. Password 1 is used in flow A, password 2 in flow B. These two steps must have distinct 'Authentication Method Ids', e.g. PASSWORD1 and PASSWORD2.
If only one identifier (e.g. "PASSWORD") is used, this may allow brute force attacks on the password as follows. Assuming an attacker knows the user's password 1, they get an unlimited number of attempts on flow B, as the 'PASSWORD' counter can repeatedly be reset to 0 by performing a successful login on flow A.To prevent such attacks, use two different counters by setting the authentication methods, for example, to PASSWORD1 and PASSWORD2, respectively.
maxResponseRetries) The number of times the user may enter a wrong response before the flow is aborted (and the challenge is deleted). If set to 0, only 1 attempt is possible for each challenge.
The purpose of this settings is usability. The failed attempts counter is always increased upon receiving a wrong OTP and the user is locked when the global failed attempts limit is exceeded.
interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: CrontoTransactionApprovalStep
id: CrontoTransactionApprovalStep-xxxxxx
displayName:
comment:
properties:
authenticatePushDevicesOnly: false
authenticationMethodId: CRONTO
crontoHandler:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
maxResponseRetries: 3
messageProvider:
onFailureGotos:
preCondition:
pushSelectionForSingleDevice: false
pushToAllDevices: false
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
Cronto was used for login (Transaction Approval only)
selectableIfNoAuthTokenIdPresent)
type: CrontoAuthTokenIdSelectionCondition
id: CrontoAuthTokenIdSelectionCondition-xxxxxx
displayName:
comment:
properties:
selectableIfNoAuthTokenIdPresent: true
CrontoSign Swiss App
pushNotificationsReminderPeriod) bankUrlIndex) pushNotificationSender)
type: CrontoSignSwissVascoPushAppHandler
id: CrontoSignSwissVascoPushAppHandler-xxxxxx
displayName:
comment:
properties:
bankUrlIndex:
pushNotificationSender:
pushNotificationsReminderPeriod: 3
CrontoSign Swiss Push Activation Possible
Flow condition that determines if the Cronto device used during login (or registered during the authentication flow) can be activated for push. It also considers the "Push Notification Reminder Period" property of the Cronto handler to determine if the user should already be asked again.
This condition is only useful in authentication flows and after a Cronto authentication or activation step.
crontoHandler)
type: CrontoPushActivationCondition
id: CrontoPushActivationCondition-xxxxxx
displayName:
comment:
properties:
crontoHandler:
CrontoSign Swiss Push Activation Step
A step that allows push activation on the CrontoSign Swiss app.
In an authentication flow, it is typically used together with the "CrontoSign Swiss Push Activation Possible" condition, which is fulfilled if the currently used device (for login or newly registered) qualifies for push activation.
In self-service flows, it can be used without a condition, allowing the user to activate any Cronto device.
crontoHandler) interactiveGotoTargets) dynamicStepActivations) skipCondition) If this condition is configured and fulfilled, the step is skipped and the flow execution continues with the subsequent step.
preCondition) requiresActivation) tagsOnSuccess) stepId) onFailureGotos) If the step fails (no retry) and a goto target for the error code is defined here, the flow does not fail and instead a "goto" to the specified target step is executed. Note that even when the "goto" is executed, any error codes that are considered a failed factor attempt will still increment the "failed attempts" counter, and may lead to the user being locked. Therefore, this may still result in a failed flow.
A typical application of this feature is switching to an alternative authentication factor step, if an external service (e.g. Futurae server, SMS gateway) is not available (error code EXTERNAL_SERVICE_UNAVAILABLE with "Strict Counting" disabled, which will not increment the "failed attempts" counter). Other error codes can be found in the IAM REST documentation, in both the general "Error Codes" section and in the documentation of specific endpoints.
customResponseAttributes) A list of custom attributes that are returned in the REST response in addition to the standard attributes the step already returns. The custom attributes defined here are only returned if the step result does not lead to an error response.
Custom attributes are added to the response when a step is initialized and when actions are executed on the step. They will therefore be available in the response leading to this step, and in any responses from endpoints specific to this step. For non-interactive steps, custom attributes are accumulated and added to the response leading to the next interactive step.
Custom attributes are not returned for 'retrieve' endpoints.
customFailureResponseAttributes)
type: CrontoPushActivationStep
id: CrontoPushActivationStep-xxxxxx
displayName:
comment:
properties:
crontoHandler:
customFailureResponseAttributes:
customResponseAttributes:
dynamicStepActivations:
interactiveGotoTargets:
onFailureGotos:
preCondition:
requiresActivation: false
skipCondition:
stepId:
tagsOnSuccess:
CSRF Token Extraction Step
This plugin obtains the login page of a backend application with a HTTP GET request. It then extracts the CSRF-token from the login form and stores it in the on-behalf login step context under the configured key for further use.
This on behalf login step is typically used as a first step in the sequence of on-behalf login steps.
csrfTokenSelector) csrfStorageKey) targetApplicationLoginPageUrl) queryParameters) If the query parameter is already defined in the target URL, the value defined through this configuration will be added to the existing values.
If the same parameter name is configured multiple times, the values will be added to the existing values in order of the configured list.
onBehalfLoginStepValidator) additionalHeaders)
type: CsrfFormTokenExtractionStep
id: CsrfFormTokenExtractionStep-xxxxxx
displayName:
comment:
properties:
additionalHeaders:
csrfStorageKey:
csrfTokenSelector:
onBehalfLoginStepValidator:
queryParameters:
targetApplicationLoginPageUrl:
CSV Renderer
headerNames) dataColumnNames) charset) fieldDelimiter) This property specifies the separation character used in the generated CSV output in order to separate fields from each other. Usually, a comma is used but, e.g., Excel requires this to be a semicolon. To use the generated file with Excel, use a semicolon, to use it with most other programs, use a comma.
If the field delimiter is a valid character in one of the exported fields, then a text delimiter has to configured! Lack of doing so might result in erroneous CSV output.
textDelimiter)
type: CsvRenderer
id: CsvRenderer-xxxxxx
displayName:
comment:
properties:
charset: UTF-8
dataColumnNames:
fieldDelimiter: ,
headerNames:
textDelimiter:
CSV Users Export
For efficiency reasons, prefer using a "User Store Configuration" over a "User Persister Configuration".
type) - BASIC: The downloaded file contains only basic infos about the user (username, roles) plus the context data selected by the context keys.
- FULL: The downloaded file contains all available data about the user plus the context data.
contextKeys) charset) separationCharacter)
type: CsvUsersExport
id: CsvUsersExport-xxxxxx
displayName:
comment:
properties:
charset: UTF-8
contextKeys:
separationCharacter: ;
type: BASIC
Current Date And Time Value Provider
type: DateAndTimeNowValueProvider
id: DateAndTimeNowValueProvider-xxxxxx
displayName:
comment:
properties:
Current Timestamp Transformer
java.util.Date. attributes)
type: CurrentTimestampTransformer
id: CurrentTimestampTransformer-xxxxxx
displayName:
comment:
properties:
attributes:
Custom CAPTCHA
siteKey) The site key can be assumed to be public knowledge and identifies the associated CAPTCHA account.
secretKey) The secret is used to validate the CAPTCHA challenge response on the custom CAPTCHA server.
captchaServiceUrl) For example, the API request for reCAPTCHA is 'https://google.com/recaptcha/api/siteverify' as POST method with the 'secret' and the user 'response' token as POST parameters.
enforceCaptchaForStep) type) proxyUri) proxyLoginUser) proxyLoginPassword)
type: CustomCaptcha
id: CustomCaptcha-xxxxxx
displayName:
comment:
properties:
captchaServiceUrl:
enforceCaptchaForStep: false
proxyLoginPassword:
proxyLoginUser:
proxyUri:
secretKey:
siteKey:
type: CUSTOM_CAPTCHA
Custom Claim (OAuth 2.0 Token Exchange)
claimName) claimValue) claimCondition) This custom claim will only be added to the issued token if the configured condition is satisfied.
If no condition is configured, the custom claim will always be added.
type: OAuth2TokenExchangeJwtCustomClaim
id: OAuth2TokenExchangeJwtCustomClaim-xxxxxx
displayName:
comment:
properties:
claimCondition:
claimName:
claimValue:
Custom Configuration-based Authentication UI
pageId) - custom.page.<ID>.title.caption: to define the caption of the page
- custom.page.<ID>.title.page: to define HTML page title. If not set, the translation from the caption is used.
stepId) requiredStepAction) uiElements) initialRestInvocation)
type: ConfigurableAuthenticationStepUi
id: ConfigurableAuthenticationStepUi-xxxxxx
displayName:
comment:
properties:
initialRestInvocation:
pageId:
requiredStepAction:
stepId:
uiElements:
Custom Configuration-based Public Self-Service UI
User interface configuration for a configurable public self-service flow step.
The step is accessible by the following URI: /<loginapp-uri>/ui/app/self-service/flow/default/ext/<ID>
pageId) - custom.page.<ID>.title.caption: to define the caption of the page
- custom.page.<ID>.title.page: to define HTML page title. If not set, the translation from the caption is used.
stepId) requiredStepAction) uiElements) initialRestInvocation)
type: ConfigurablePublicSelfServiceStepUi
id: ConfigurablePublicSelfServiceStepUi-xxxxxx
displayName:
comment:
properties:
initialRestInvocation:
pageId:
requiredStepAction:
stepId:
uiElements:
Custom Configuration-based Self-Service UI
User interface configuration for a configurable protected self-service flow step.
The step is accessible by the following URI: /<loginapp-uri>/ui/app/protected/flow/<FLOW_ID>/ext/<ID>
pageId) - custom.page.<ID>.title.caption: to define the caption of the page
- custom.page.<ID>.title.page: to define HTML page title. If not set, the translation from the caption is used.
stepId) requiredStepAction) uiElements) initialRestInvocation)
type: ConfigurableSelfServiceStepUi
id: ConfigurableSelfServiceStepUi-xxxxxx
displayName:
comment:
properties:
initialRestInvocation:
pageId:
requiredStepAction:
stepId:
uiElements:
Custom Configuration-based User Self-Registration UI
User interface configuration for a configurable user self-registration flow step.
The step is accessible by the following URI: /<loginapp-uri>/ui/app/registration/flow/<FLOW_ID>/ext/<ID>
pageId) - custom.page.<ID>.title.caption: to define the caption of the page
- custom.page.<ID>.title.page: to define HTML page title. If not set, the translation from the caption is used.
stepId) requiredStepAction) uiElements) initialRestInvocation)
type: ConfigurableUserSelfRegStepUi
id: ConfigurableUserSelfRegStepUi-xxxxxx
displayName:
comment:
properties:
initialRestInvocation:
pageId:
requiredStepAction:
stepId:
uiElements:
Custom Flow Processors
Allows to configure custom processors for any kind of flow.
Security Warning: For advanced users only. A custom processor configuration may change the behavior of, e.g., counting of failed logins, user locking and user validity checks. Using this advanced option may therefore have major security implications. Only use this option if you understand how to achieve a secure processor configuration.
processors) Custom list of processors that are applied in the configured order.
It is crucial to understand that a faulty processor configuration leads to an insecure system. Unless the consequences are well understood, it is recommended to work with the respective default processors plugin provided for the flow type in question. Please read its documentation to know which processors it uses internally. Also read the plugin documentations of the individual processors, in particular to understand which processors are combinable and if so in which order.
type: CustomFlowProcessors
id: CustomFlowProcessors-xxxxxx
displayName:
comment:
properties:
processors:
Custom JavaScript-based Authentication UI
User interface configuration for a custom JavaScript authentication flow step.
The step is accessible by the following URI: /<loginapp-uri>/ui/app/auth/flow/<FLOW_ID>/ext/<ID>
pageId) - custom.page.<ID>.title.caption: to define the caption of the page
- custom.page.<ID>.title.page: to define HTML page title. If not set, the translation from the caption is used.
stepId) requiredStepAction)
type: CustomJavaScriptAuthenticationStepUi
id: CustomJavaScriptAuthenticationStepUi-xxxxxx
displayName:
comment:
properties:
pageId:
requiredStepAction:
stepId:
Custom JavaScript-based Public Self-Service UI
User interface configuration for a custom JavaScript public self-service flow step.
The step is accessible by the following URI: /<loginapp-uri>/ui/app/self-service/flow/default/ext/<ID>
pageId) - custom.page.<ID>.title.caption: to define the caption of the page
- custom.page.<ID>.title.page: to define HTML page title. If not set, the translation from the caption is used.
stepId) requiredStepAction)
type: CustomJavaScriptPublicSelfServiceStepUi
id: CustomJavaScriptPublicSelfServiceStepUi-xxxxxx
displayName:
comment:
properties:
pageId:
requiredStepAction:
stepId:
Custom JavaScript-based Self-Service UI
User interface configuration for a custom JavaScript self-service flow step.
The step is accessible by the following URI: /<loginapp-uri>/ui/app/protected/flow/<FLOW_ID>/ext/<ID>
pageId) - custom.page.<ID>.title.caption: to define the caption of the page
- custom.page.<ID>.title.page: to define HTML page title. If not set, the translation from the caption is used.
stepId) requiredStepAction)
type: CustomJavaScriptSelfServiceStepUi
id: CustomJavaScriptSelfServiceStepUi-xxxxxx
displayName:
comment:
properties:
pageId:
requiredStepAction:
stepId:
Custom JavaScript-based User Self-Registration UI
User interface configuration for a custom JavaScript user self-registration flow step.
The step is accessible by the following URI: /<loginapp-uri>/ui/app/registration/flow/<FLOW_ID>/ext/<ID>
pageId) - custom.page.<ID>.title.caption: to define the caption of the page
- custom.page.<ID>.title.page: to define HTML page title. If not set, the translation from the caption is used.
stepId) requiredStepAction)
type: CustomJavaScriptUserSelfRegStepUi
id: CustomJavaScriptUserSelfRegStepUi-xxxxxx
displayName:
comment:
properties:
pageId:
requiredStepAction:
stepId:
Custom Protected Self-Service Flow
flowId) steps) accessCondition) Precondition that must be fulfilled for a user to access this flow.
Note the difference to the "Authorization Condition":- Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
authorizationCondition) - Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
processors) persistencyless) If enabled, this flow does not consider persistency, i.e. users don't have to exist locally in order to use a self-service. This is typically used with SSO tickets or external authentication using OAuth or SAML.
Persistency-less flows are very limited in their capabilities, in particular:
- The user state (locked, invalid etc.) cannot be verified.
- Flow steps editing user data will complete without failure but changed data is lost.
Note that configuration validation support is limited. It is essential to test such a flow extensively to ensure it behaves correctly in all situations.
It is recommended to use the "Default Persistency-less Protected Self-Service Processors" when using a persistency-less flow.
type: CustomProtectedSelfServiceFlow
id: CustomProtectedSelfServiceFlow-xxxxxx
displayName:
comment:
properties:
accessCondition:
authorizationCondition:
flowId:
persistencyless: false
processors:
steps:
Custom Public Self-Service Restrictions
Custom configuration for public self-service restrictions.
See the plugin descriptions of "Default Password Reset Restrictions" or "Default Self-Unlock Restrictions" for determine reasonable sets of restrictions.
restrictions) Restrictions define which users are allowed to perform a public self-service. These restrictions are checked in the configured order and after the first restriction disallows public self-service, no further checks are performed.
Security Warning: We recommend to use at least the restrictions provided by the "Default Password Reset Restrictions". Omitting these restrictions may allow public self-service for unauthorized (e.g. locked or invalid) users. The "Nonexistent User Restriction" is probably always needed and should be the first restriction in the list.
type: CustomPublicSelfServiceRestrictions
id: CustomPublicSelfServiceRestrictions-xxxxxx
displayName:
comment:
properties:
restrictions:
Custom User Persister-based User Store Provider
userPersister)
type: CustomUserPersisterBasedUserStoreProvider
id: CustomUserPersisterBasedUserStoreProvider-xxxxxx
displayName:
comment:
properties:
userPersister:
Customizable Device List
In case no Airlock 2FA account is associated with the current user, no device IDs are returned.
deviceFilters) A device will only be returned by this provider in case it passes all the filtering steps defined by this sequence. An example is given in the plugin documentation.
Note: No configured predicate (default) means all device IDs of the user will be returned.
Note: Generally, combining the device filters using a "Logical AND Device Condition", and configuring it as a single filter is not equivalent to using a list of filters.
airlock2FASettings)
type: CustomizableAirlock2FADeviceIdsProvider
id: CustomizableAirlock2FADeviceIdsProvider-xxxxxx
displayName:
comment:
properties:
airlock2FASettings:
deviceFilters:
Customizable Identity Generator
pattern) Pattern syntax:
pattern = fix_part | random_part [fix_part | random_part]*
random_part = {alphabet_name:number_of_characters}
fix_part = any_string_without_'{'
The alphabet_name refers either to a built-in alphabet (see below) or to a custom alphabet defined in the separate Alphabets property below.
Examples:
{digits:6} → 482913
OTP-{digits:4} → OTP-4821
{HEX:8} (with HEX defined in the custom Alphabets property below) → A9F03C1B
Built-in and ready-to-use alphabets are:
- "
digits" all decimal digits (i.e. the characters 0123456790) - "
lower26" standard alphabet with 26 lowercase letters (i.e. the characters abcdefghijklmnopqrstuvwxyz) - "
upper26" standard alphabet with 26 uppercase letters (i.e. the characters ABCDEFGHIJKLMNOPQRSTUVWXYZ) - "
alpha52" standard alphabet with 26 upper- and 26 lowercase letters (i.e. the characters ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz) - "
distinct" distinct standard characters: digits, upper- and lowercase letter without the hard to distinguish '0,O,1,l,I' (i.e. the characters 23456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ) - "
DISTINCT" distinct standard characters (with uppercase letters): digits and uppercase letter without the hard to distinguish '0,O,1,I' (i.e. the characters 23456789ABCDEFGHJKLMNPQRSTUVWXYZ) - "
extended" contains most of the characters visible on a computer keyboard without the hard to distinguish '0,O,1,l,I' (i.e. the characters +-.,:;$<>()[]{}%&!?/*@#=_23456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ)
NOTE: Characters in this pattern do not pass the input filter for tokens (OTP, SMS, and alike). Choose a different pattern for tokens or relax the corresponding pattern (in the Loginapp's security settings). Characters may be blocked by a WAF deny rule.
Using custom alphabets:
1. Define an alphabet in the Alphabets property below.
2. Reference it in the pattern using {alphabet_name:number_of_characters} where the is the key of the alphabet in the Alphabets property.
alphabets) How it works:
The map key defines the alphabet_name:number_of_characters.
The plugin (alphabet) defines the characters used for sampling during random generation.
The alphabet can then be referenced in the Pattern property above using {alphabet_name:number_of_characters}.
Example configuration:
Key (alphabet_name): HEX
Plugin: Alphabet with the following characters 0123456789ABCDEF
Example usage in the Pattern property above:
{HEX:8} → A9F03C1B
OTP-{HEX:6} → OTP-4F9A2C
type: CustomizableIdentityGenerator
id: CustomizableIdentityGenerator-xxxxxx
displayName:
comment:
properties:
alphabets:
pattern: user{digits:8}
Customizable Password Policy
Password policy validates a password against a list of predefined password policy checks. Each password policy check validates one requirement of the password.
Not all checks are applied in all situations (e.g. a check whether a password is too young to be changed is not applied during a mandatory password change).
policyChecks) optionalPolicyChecks) minimumPassedOptionalChecks)
type: CustomizablePasswordPolicy
id: CustomizablePasswordPolicy-xxxxxx
displayName:
comment:
properties:
minimumPassedOptionalChecks: 0
optionalPolicyChecks:
policyChecks:
Data Sources
- User data
- Token data
Note that data sources for some tokens are configured directly in the corresponding token-specific settings.
userStore) tokenDataSource) userTrailDataSource) Configures the global settings to persist user trail log messages across all modules.
If defined, user trail logs are additionally forwarded to the referenced repository. This does not affect writing messages to the respective module log files.
deviceUsageDataSource) acceptedSsoTicketRepository) Configures the repository used to store accepted SSO tickets and reject previously accepted ones.
The in-memory repository cannot be used if multiple instances of IAM are deployed in parallel (failover, horizontal scaling). Furthermore, the in-memory repository does not preserve previously accepted SSO tickets across IAM restarts.
type: GlobalPersisterSettings
id: GlobalPersisterSettings-xxxxxx
displayName:
comment:
properties:
acceptedSsoTicketRepository:
deviceUsageDataSource:
tokenDataSource:
userStore:
userTrailDataSource:
Database Credential Persister
The database is accessed via JDBC. It fetches the data of a user by directly executing a prepared statement. Making changes persistent is achieved by multiple update statement executions on the user record within a transaction.
This plug-in is very flexible in that it allows you to specify extra where clauses and search filters to select the set of credential records.
Note: This persister also supports iteration over credentials.
How this plug-in finds a credential record
There are two ways how this plugin finds a credential record for getting data, updating data and deleting data. The credential record is always fetched using a select statement given a primary key and applying the configured filters (additional where clause). The two variants differ in how the primary key is determined:- The primary key for selecting the credential record is the username itself. This is by far the most common and most efficient method to obtain credential data.
- The primary key is determined by a separate query including the username. The query can be configured. This way of selecting the credential record is more flexible but results in an additional select statement.
sqlDataSource) credentialTableName) colUserName) userNameResolveQuery) Such a query is useful if the username (used on the login page) is not part of the user table.
The query must be such that - given the username - it returns one value that can be used as primary key in the user table. The query must contain one question mark (?) which will be substituted by the username (a string).
If the query returns no records, it results in the user not being found.
If the query returns more than one record, it results in the username being ambiguous.
If this property is not defined, the username itself is used as primary key in the user table (the usual and efficient way).
Note: If this property is defined credential insertion by this plugin is no more possible.
colBinaryCredentialData) BYTE or VARBYTE.
The presence of this property indicates that the credential data is stored in binary form and not in string form. If this property is set, this class returns (and expects) instances of CredentialBean returning false in method "CredentialBean.isCredentialDataStringType()".
You cannot specify both this property and property "col-string-credential-type".
colStringCredentialData) VARCHAR or CHAR.
The presence of this property indicates that the credential data is stored as string and not in binary form. If this property is set, this class returns (and expects) instances of CredentialBean returning true in method "CredentialBean.isCredentialDataStringType()".
You cannot specify both this property and property "col-binary-credential-type".
colCredentialSerial) VARCHAR or CHAR. colCredentialNotActiveAfter) DATETIME or TIMESTAMP. colCredentialNotActiveBefore) DATETIME or TIMESTAMP. colCredentialDeliveryDate) DATETIME or TIMESTAMP colCredentialGenerationDate) DATETIME or TIMESTAMP colNextBinaryCredentialData) BYTE or VARBYTE.
The presence of this property indicates that the credential data is stored in binary form and not in string form. If this property is set, this class returns (and expects) instances of CredentialBean returning false in method "CredentialBean.isCredentialDataStringType()".
You cannot specify both this property and property "col-string-credential-type".
colNextStringCredentialData) VARCHAR or CHAR.
The presence of this property indicates that the credential data is stored as string and not in binary form. If this property is set, this class returns (and expects) instances of CredentialBean returning true in method "CredentialBean.isCredentialDataStringType()".
You cannot specify both this property and property "col-binary-credential-type".
colNextCredentialSerial) VARCHAR or CHAR. colNextCredentialNotActiveAfter) DATETIME or TIMESTAMP. colNextCredentialNotActiveBefore) DATETIME or TIMESTAMP. colNextCredentialDeliveryDate) DATETIME or TIMESTAMP colNextCredentialGenerationDate) DATETIME or TIMESTAMP colCredentialActive) CHAR or NUMBER. The value "0" (zero) is treated as false, any other value is treated as true.
If the column is not specified, all credentials are considered to be active.
colOtherCredentialsDeliveryTimestamps) colCredentialOrderedFlag) CHAR or NUMBER. The value "0" is treated as false, any other value is treated as true. colCredentialOrderedUser) CHAR or VARCHAR. colCredentialOrderedDate) DATETIME or TIMESTAMP. additionalWhereClause) The SQL query without an additional where clause is "SELECT * FROM credential-table WHERE colusername = 'username'"(real values for "credential-table", "colusername" are taken from the configuration and "username" is taken from the credential object).
The SQL query with an additional where clause "xyz" is: "SELECT * FROM credential-table WHERE colusername = 'username' AND xyz".
Example: If the value of this configuration setting is "GROUP = 'a' AND COD = 1" the resulting query is "SELECT * FROM credential-table WHERE colusername = 'username' AND GROUP = 'a' AND COD = 1"
searchConditionQuery) After the credential has been found by username (and matching the optional additional where clause as specified by configuration property "additional-where-clause") the query specified by this configuration property is executed.
If the result of the query is "true" or "1", the credential record is considered valid. In all other cases, the credential record is not valid, i.e. the behaviour is as if the record did not exist.
The value of this configuration property can be empty (no effect) or any valid SQL query. You can use values of the user record (Record selected from table specified by configuration property "user-table-name" by user name and optionally additional where clause) in the query as follows: ${xxx} references the field (column) "xxx" from the selected user record.
Example:
In our example the selected user record has the following values (column name = value): user_id = 'freddy', person_no = 13, ... Further, there is a different database table "PERSON" which is referenced by the user table. The table "PERSON" has a column of type boolean called "valid" which indicates whether a person record is valid or not.
Consider the following value for this configuration property: SELECT p.valid FROM PERSON p WHERE p.person_no = ${person_no} Thus, when looking for the user record (given the username and the matching the optional additonal where part), the above query is executed where ${person_no} is substituted by the value 13 of field "person_no" of the selected user record.
additionalIteratorWhereClause) iteratorQuery) Specifying such a query is only necessary if the username cannot be used as primary key in the user table (this only if property "user-name-resolve-query" is specified).
The query must be such that it returns one-column records one username (userid) per row.
Note that his query is used both when returning all user ids and when returning only matching user ids (filtered by the user). Thus, the query must be such that LIKE-clauses against context data columns work. This usually means that you must join the result with the user table (even if the user id is not read from the usertable) so the LIKE-clauses can access the context data of the user table. Failing to do so will result in runtime SQL syntax exceptions!Note: If this property is specified, additional-iterator-clauses and the deleted flag is ignored. They must be part of the query itself!
contextDataItems) additionalContextData) user-table-name by user name) in the query as follows: ${xxx} refers to the field (column) xxx from the selected user record.
Note: These context data values are read only! When fetching credential records, the query will be executed for each credential and the values will be added to the context data container. Modified, new or deleted values will not be written when credential records are updated.
Also note that context data fields defined in configuration property context-data-columns override corresponding entries in this property.
Example:
SELECT p.mobile_no FROM person p WHERE p.person_no = ${person_no}
colDeleted) Note: If a credential is deleted and this property is defined, the record is marked as deleted and not really removed from the database! If this property is not defined and a credential is deleted, the record is deleted from the database. The type of this column is either
CHAR or NUMBER. The value "0" is treated as not deleted, any other value is treated as deleted. colVersionId) Such a technical column is used by some applications or libraries (such as Hibernate) to implement optimistic locking.
Note that this plugin still uses its own data-based optimistic locking mechanism. It just increments the value within a transaction in order to be compliant with other components' locking mechanisms.
The column must be of an integer type. Usually a long type is used.
colRecordModificationDate) The type of the column must be compatible with a timestamp.
Note that - if configured (see separate property) - user information may also be written to the database at the same time.
colRecordModificationUser) Note that - if configured (see separate property) - the modification date may also be written to the database at the same time.
recordModificationUser)
type: DatabaseCredentialPersister
id: DatabaseCredentialPersister-xxxxxx
displayName:
comment:
properties:
additionalContextData:
additionalIteratorWhereClause:
additionalWhereClause:
colBinaryCredentialData:
colCredentialActive:
colCredentialDeliveryDate:
colCredentialGenerationDate:
colCredentialNotActiveAfter:
colCredentialNotActiveBefore:
colCredentialOrderedDate:
colCredentialOrderedFlag:
colCredentialOrderedUser:
colCredentialSerial:
colDeleted:
colNextBinaryCredentialData:
colNextCredentialDeliveryDate:
colNextCredentialGenerationDate:
colNextCredentialNotActiveAfter:
colNextCredentialNotActiveBefore:
colNextCredentialSerial:
colNextStringCredentialData:
colOtherCredentialsDeliveryTimestamps:
colRecordModificationDate:
colRecordModificationUser:
colStringCredentialData:
colUserName:
colVersionId:
contextDataItems:
credentialTableName:
iteratorQuery:
recordModificationUser:
searchConditionQuery:
sqlDataSource:
userNameResolveQuery:
Database Field
column) value)
type: DatabaseField
id: DatabaseField-xxxxxx
displayName:
comment:
properties:
column:
value:
Database Login History Repository
sqlDataSource) maxNumberOfEntries)
type: DatabaseLoginHistoryRepository
id: DatabaseLoginHistoryRepository-xxxxxx
displayName:
comment:
properties:
maxNumberOfEntries: 50
sqlDataSource:
Database Maintenance Message Persister
Database interface for persisting maintenance messages.
The database model is based on two database tables: the first stores message details such as validity period, system availability, etc and the second stores the translations associated to the messages.
sqlDataSource) cacheTimeout) Setting this property to 0 (zero) or omitting this property results in a direct call to the underlying database layer every time the provider is asked for a maintenance message.
Note that the usage of the location token "${location}" in the additional where-clause of the message, disables caching.
messageTable) messageColName) messageColSystemAvailable) messageColActive) messageColValidFrom) messageColValidTo) messageColLocation) messageColVersionId) The column must be of an integer type. Usually a long type is used.
messageColRecordInsertionDate) The type of the column must be compatible with a timestamp.
Note that - if configured (see separate property) - user information may alos be written to the database at the same time.
messageColRecordInsertionUser) Note that - if configured (see separate property) - the insertion date may alo be written to the database at the same time.
messageColRecordModificationDate) The type of column must be compatible with a timestamp.
Note that - if configured (see separate property) - user information may also be written to the database at the same time.
messageColRecordModificationUser) Note that - if configured (see separate property - the modification date may also be written to the database at the same time.
messageAdditionalWhereClause) The SQL query without an additional where clause is something like
SELECT * FROM message_table WHERE VALID_FROM <= now AND VALID_TO >= now.
The SQL query with an additional where clause
xyz is: SELECT * FROM message_table WHERE VALID_FROM <= now AND VALID_TO >= now AND (xyz).
Note that this where clause may be overridden for the message lookup using property "Message Lookup Additional Where Clause".
translationTable) translationColMessageRef) message-col-name translationColLanguage) translationColMessage) translationAdditionalWhereClause) The SQL query without an additional where clause is something like
SELECT * FROM translation_table WHERE language = 'en'.
The SQL query with an additional where clause
xyz is: SELECT * FROM translation_table WHERE language = 'en' AND xyz. recordModificationUser) additionalInsertData) This allows you to add arbitrary fixed or dynamic values when a new record is created. This is useful if some database fields may not be NULL but are not inserted by this plugin by default.
CautionMake sure to appropriately escape values (e.g. use single quotes around strings). They are used as provided in the SQL insert statements. This allows calling database dependent functions (e.g. in order to get a sequence number, system date, etc).
additionalInsertDataTranslations) This allows you to add arbitrary fixed or dynamic values when a new record is created. This is useful if some database fields may not be NULL but are not inserted by this plugin by default.
CautionMake sure to appropriately escape values (e.g. use single quotes around strings). They are used as provided in the SQL insert statements. This allows calling database dependent functions (e.g. in order to get a sequence number, system date, etc).
type: DatabaseMaintenanceMessagePersister
id: DatabaseMaintenanceMessagePersister-xxxxxx
displayName:
comment:
properties:
additionalInsertData:
additionalInsertDataTranslations:
cacheTimeout: 0
messageAdditionalWhereClause:
messageColActive:
messageColLocation:
messageColName:
messageColRecordInsertionDate:
messageColRecordInsertionUser:
messageColRecordModificationDate:
messageColRecordModificationUser:
messageColSystemAvailable:
messageColValidFrom:
messageColValidTo:
messageColVersionId:
messageTable:
recordModificationUser: Medusa
sqlDataSource:
translationAdditionalWhereClause:
translationColLanguage:
translationColMessage:
translationColMessageRef:
translationTable:
Database Sequence Generator
Sequence generator storing the sequence number in a database.
sqlDataSource) sequenceName) tableName) columnSequenceName) columnSequenceNumber)
type: DatabaseSequenceGenerator
id: DatabaseSequenceGenerator-xxxxxx
displayName:
comment:
properties:
columnSequenceName: NAME
columnSequenceNumber: STATE
sequenceName:
sqlDataSource:
tableName: SEQUENCES
Database Token List Persister
This plug-in allows you to specify extra where clauses and search filters to select the set of users.
How this plug-in finds a user record
There are two ways how this plugin finds a user record for getting user data, updating user data and deleting user data. The user record is always fetched using a select statement given a primary key and applying the configured filters (additional where clause). The two variants differ in how the primary key is determined:- The primary key for selecting the user record is the username itself. This is by far the most common and most efficient method to obtain user data.
- The primary key is determined by a separate query including the username. The query can be configured. This way of selecting the user record is more flexible but results in an additional select statement.
Estimate for the Length of the Token List Database Field
The length of the encoded token hash list depends mainly on the number of unused tokens in the list, the used hash function and the encoding of the list. Here is an example using the SHA1PasswordHash as hashfunction (which produces 40 bytes for each token) together with the hashed token list encoding used by this persister implementation (actually it is the encoding provided byTokenListHasher#hashedTokenListToBytes(HashedTokenList) ):Each unused token uses 40 bytes for the hash value, 4 bytes for the index and 4 bytes for the length of the hash value, thus 48 bytes. Due to the nature of the hash function, this figures are independent of the length of the tokens.
Additionally the encoded list holds the number of the tokens (when the list was new) in 4 bytes, the length of the identification string in 4 bytes, the identification string of arbitrary length and the generation timestamp in 8 bytes. This makes another 16 bytes excluding the identification string.
If the list has 100 tokens and the identification string is 20 bytes at most, this makes 100 * 48 + 16 + 20 = 4836 bytes.
sqlDataSource) tokenListTableName) colUserName) userNameResolveQuery) Such a query is useful if the username (used on the login page) is not part of the user table.
The query must be such that - given the username - it returns one value that can be used as primary key in the user table. The query must contain one question mark (?) which will be substituted by the username (a string).
If the query returns no records, it results in the user not being found.
If the query returns more than one record, it results in the username being ambiguous.
If this property is not defined, the username itself is used as primary key in the user table (the usual and efficient way).
Note: If this property is defined, user insertion by this plugin is no more possible.
colTokenList) colNewTokenList) colGenerationTimeStamp) DATETIME or TIMESTAMP colDeliveryTimeStamp) DATETIME or TIMESTAMP colOtherCredentialsDeliveryTimestamps) colListActive) CHAR or NUMBER. The value "0" (zero) is treated as false, any other value is treated as true.
If the column is not specified, all token lists are considered to be active.
colChallengeOpenSince) DATETIME or TIMESTAMP. colUnansweredChallenges) NUMBER. colNewListOrdered) CHAR or NUMBER. The value "0" is treated as false, any other value is treated as true. colNewListOrderedUser) VARCHAR. colNewListOrderedDate) DATETIME or TIMESTAMP. additionalWhereClause) The SQL query without an additional where clause is "SELECT * FROM token-list-table WHERE colusername = 'username'"(real values for "token-list-table", "colusername" are taken from the configuration and "username" is taken from the token list object).
The SQL query with an additional where clause "xyz" is: "SELECT * FROM token-list-table WHERE colusername = 'username' AND xyz".
Example: If the value of this configuration setting is "GROUP = 'a' AND COD = 1" the resulting query is "SELECT * FROM token-list-table WHERE colusername = 'username' AND GROUP = 'a' AND COD = 1"
additionalIteratorWhereClause) iteratorQuery) Specifying such a query is only necessary if the username cannot be used as primary key in the user table (this only if property "user-name-resolve-query" is specified).
The query must be such that it returns one-column records one username (userid) per row.
Note that his query is used both when returning all user ids and when returning only matching user ids (filtered by the user). Thus, the query must be such that LIKE-clauses against context data columns work. This usually means that you must join the result with the user table (even if the user id is not read from the usertable) so the LIKE-clauses can access the context data of the user table. Failing to do so will result in runtime SQL syntax exceptions!Note: If this property is specified, additional-iterator-clauses and the deleted flag is ignored. They must be part of the query itself!
contextDataItems) colVersionId) Such a technical column is used by some applications or libraries (such as Hibernate) to implement optimistic locking.
Note that this plugin still uses its own data-based optimistic locking mechanism. It just increments the value within a transaction in order to be compliant with other components' locking mechanisms.
The column must be of an integer type. Usually a long type is used.
colRecordModificationDate) The type of the column must be compatible with a timestamp.
Note that - if configured (see separate property) - user information may also be written to the database at the same time.
colRecordModificationUser) Note that - if configured (see separate property) - the modification date may also be written to the database at the same time.
recordModificationUser)
type: DatabaseTokenListPersister
id: DatabaseTokenListPersister-xxxxxx
displayName:
comment:
properties:
additionalIteratorWhereClause:
additionalWhereClause:
colChallengeOpenSince:
colDeliveryTimeStamp:
colGenerationTimeStamp:
colListActive:
colNewListOrdered:
colNewListOrderedDate:
colNewListOrderedUser:
colNewTokenList:
colOtherCredentialsDeliveryTimestamps:
colRecordModificationDate:
colRecordModificationUser:
colTokenList:
colUnansweredChallenges:
colUserName:
colVersionId:
contextDataItems:
iteratorQuery:
recordModificationUser: Medusa
sqlDataSource:
tokenListTableName:
userNameResolveQuery:
Database Token Persister
Defines the table and column names, as well as additional query settings for the Database Token Persister.
This persister handles both token and token assignment data.
sqlDataSource) tokenTable) tokenSequence) The name of the database sequence providing primary keys (Oracle only).
If left empty, Airlock IAM expects the database to support auto-increment columns (SQL Server, MySQL).
tokenColTokenId) The name of the column holding the token identity (primary key).
This column needs to be set to auto_increment (H2, mysql,..) or the database sequence name must be configured (Oracle).
tokenColType) tokenColSerialId) tokenColActive) tokenColActivationDate) tokenColObsoletesTokenId) The name of the column holding the 'obsoletes_token' token reference (foreign key).
Stores a reference to the token that gets deactivated the next time this token is used.
tokenColValidityRangeLower) tokenColValidityRangeUpper) tokenColGenerationDate) tokenColFirstUsageDate) tokenColLatestUsageDate) tokenColTotalUsages) tokenColTokenData) tokenColActivatesTokenId) The name of the column holding the 'activates_token' token reference (foreign key).
Stores a reference to the token that gets activated the next time this token is used.
tokenColGenericDataElement1) tokenColGenericDataElement2) tokenColGenericDataElement3) tokenColGenericDataElement4) tokenColGenericDataElement5) tokenColGenericDataElement6) tokenColGenericDataElement7) tokenColGenericDataElement8) tokenColGenericDataElement9) tokenColGenericDataElement10) tokenColGenericDataElement11) tokenColGenericDataElement12) tokenColTrackingId) tokenAdditionalWhereClause) Optional SQL query condition that is added to the WHERE clause when searching for, updating or deleting tokens.
- Example for an SQL query without an additional WHERE clause:
SELECT * FROM token WHERE type = 'myTokenType' - Example for an SQL query with an additional WHERE clause "
foo()":SELECT * FROM token WHERE type = 'myTokenType' AND foo()
Note that this WHERE clause may be overridden for the token lookup using the property: "Token Search Additional Where Clause"
tokenSearchAdditionalWhereClause) additionalTokenInsertData) This property defines a list of name/value pairs used in insert statements when a new token record is inserted.
This allows you to add arbitrary fixed or dynamic values when a new record is created.
Caution: Make sure to appropriately escape values (e.g. use single quotes around strings). They are used as provided in the SQL insert statements. This allows calling database dependent functions (e.g. in order to get a sequence number, system date, etc). Also, do not use any of the standard fields of the token table.
tokenAssignmentTable) tokenAssignmentColTokenId) tokenAssignmentColUser) tokenAssignmentColAssignmentDate) tokenAssignmentColAssignmentUser) tokenAssignmentColOrderNew) tokenAssignmentColOrderNewUser) tokenAssignmentColOrderNewDate) tokenAssignmentColOrderOptions) tokenAssignmentColAdditionalInformation) tokenAssignmentColComment) tokenAssignmentAdditionalWhereClause) Optional SQL query condition that is added to the WHERE clause when searching for, updating or deleting token assignments.
- Example for an SQL query without additional WHERE clause:
SELECT * FROM token_assignment WHERE ta_user = 'user' - Example for an SQL query with additional WHERE clause "
foo()":SELECT * FROM token_assignment WHERE ta_user = 'user' AND foo()
additionalTokenAssignmentInsertData) This property defines a list of name/value pairs used in insert statements when a new token assignment record is inserted.
This allows you to add arbitrary fixed or dynamic values when a new record is created.
Caution: Make sure to appropriately escape values (e.g. use single quotes around strings). They are used as provided in the SQL insert statements. This allows calling database dependent functions (e.g. in order to get a sequence number, system date, etc). Also, do not use any of the standard fields of the token assignment table.
type: DatabaseTokenPersister
id: DatabaseTokenPersister-xxxxxx
displayName:
comment:
properties:
additionalTokenAssignmentInsertData:
additionalTokenInsertData:
sqlDataSource:
tokenAdditionalWhereClause:
tokenAssignmentAdditionalWhereClause:
tokenAssignmentColAdditionalInformation:
tokenAssignmentColAssignmentDate:
tokenAssignmentColAssignmentUser:
tokenAssignmentColComment:
tokenAssignmentColOrderNew:
tokenAssignmentColOrderNewDate:
tokenAssignmentColOrderNewUser:
tokenAssignmentColOrderOptions:
tokenAssignmentColTokenId:
tokenAssignmentColUser:
tokenAssignmentTable:
tokenColActivatesTokenId:
tokenColActivationDate:
tokenColActive:
tokenColFirstUsageDate:
tokenColGenerationDate:
tokenColGenericDataElement1:
tokenColGenericDataElement10:
tokenColGenericDataElement11:
tokenColGenericDataElement12:
tokenColGenericDataElement2:
tokenColGenericDataElement3:
tokenColGenericDataElement4:
tokenColGenericDataElement5:
tokenColGenericDataElement6:
tokenColGenericDataElement7:
tokenColGenericDataElement8:
tokenColGenericDataElement9:
tokenColLatestUsageDate:
tokenColObsoletesTokenId:
tokenColSerialId:
tokenColTokenData:
tokenColTokenId:
tokenColTotalUsages:
tokenColTrackingId:
tokenColType:
tokenColValidityRangeLower:
tokenColValidityRangeUpper:
tokenSearchAdditionalWhereClause:
tokenSequence:
tokenTable:
Database User Persister
This plug-in is very flexible in that most database columns are optional and it allows you to specify extra where clauses and search filters to select the set of users. It also allows to fetch role information from separate tables.
Note: This persister also supports insertion and deletion of users and can be used to iterate over users.
How this plug-in finds a user record
There are two ways how this plugin finds a user record for getting user data, updating user data and deleting user data. The user record is always fetched using a select statement given a primary key and applying the configured filters (additional where clause). The two variants differ in how the primary key is determined:- The primary key for selecting the user record is the username itself. This is by far the most common and most efficient method to obtain user data.
- The primary key is determined by a separate query including the username. The query can be configured. This way of selecting the user record is more flexible but results in an additional select statement.
sqlDataSource) userTableName) colUserName) userNameResolveQuery) Such a query is useful if the username (used on the login page) is not part of the user table.
The query must be such that - given the username - it returns one value that can be used as primary key in the user table. The query must contain one question mark (?) which will be substituted by the username (a string).
If the query returns no records, it results in the user not being found.
If the query returns more than one record, it results in the username being ambiguous.
If this property is not defined, the username itself is used as primary key in the user table (the usual and efficient way).
Note: If this property is defined user insertion by this plugin is no more possible.
colPassword) In general the type of this database column is expected to be BYTE or VARBYTE because password hashes are byte sequences. However, if a password hash function is used that returns a character sequence (for example the password itself) this also works with column type CHAR or VARCHAR.
The plug-in tries to find out automatically whether the password hash is binary or string type by reading a value from the database and looking at the type of the returned object. This may lead to problems with NULL values or "too intelligent" JDBC drivers that implicitly convert HEX- or base64-strings to binary data. The optional property "Is Pwd Hash String Type" can be used to tell the plug-in explicitly what data type this column is.
isPwdHashStringType) The value
TRUE indicates that the password hash column is a string type column. The value FALSE indicates that the password hash column is a binary type column.
If this optional property is not defined or empty, the plug-in tries to determine the type of column automatically (see description of property "Col Password").
colAuthMethod) CHAR, VARCHAR) and its value may be NULL. defaultAuthMethod) colNextAuthMethod) CHAR, VARCHAR) and its value may be NULL. defaultNextAuthMethod) colAuthMigrationDate) DATETIME or TIMESTAMP and its value may be NULL. colUserLocked) Authenticators usually set a user locked after some number of consecutively failed login attempts. This column type is either
CHAR or NUMBER. The value "0" is treated as false, any other value is treated as true.
If this column is not specified, users are not considered locked.
colUserLockReason) This can be the hole description of the reason or a key to the string resource.
This column type is either
CHAR or VARCHAR. colUserLockDate) The type of this column either
DATETIME or TIMESTAMP. colFailedLogins) NUMBER.
If this column is not specified, the failed logins are not counted.
colFailedTokenCounts) CLOB (or a DB-type equivalent).
If this column is not specified, the failed attempts in the flow-based REST authentication API are not counted.
colFailedLoginsBeforeLatestLogin) NUMBER.
If this column is not specified, the failed logins before the latest successful login are not counted.
colTotalLogins) NUMBER.
If this column is not specified, the successful logins are not counted.
colPasswordChangeForced) This column type is either
CHAR or NUMBER. The value "0" is treated as false, any other value is treated as true.
If this column is not specified, no password change is enforced.
colPasswordDeliveryDate) The type of this column either
DATETIME or TIMESTAMP. Note that it will work with most data types but depending on the chosen database data type, only the date without the time is stored.
If this column is not specified, the delivery date of the latest password is not provided to callers.
colOtherCredentialsDeliveryTimestamps) The type of every referenced column is either a
DATETIME or TIMESTAMP.
This information can be used by components that care about not delivering more than one user credential at the same time.
If this column is not specified, no delivery dates are provided to callers.
colPasswordGenerationDate) The type of this column either
DATETIME or TIMESTAMP.
This information is needed by components in which the generation date of a password and its delivery date is not necessarily the same. This can - for example - be the case when a generated credential is held back because another credential for the same user is delivered at the same time.
If this column is not specified, no password generation date is provided to callers.
colLatestPasswordChange) The type of this column either
DATETIME or TIMESTAMP.
colNextEnforcedPasswordChange) The type of this column either
DATETIME or TIMESTAMP.
colPasswordOrderedFlag) This column type is either
CHAR or NUMBER. The value "0" is treated as false, any other value is treated as true.
If this column is not specified, the password order state is always reported to be
false. colPasswordOrderedUser) This column type is either
CHAR or VARCHAR.
If this column is not specified, the password order user is always
null. colPasswordOrderedDate) This column type is either
DATETIME or TIMESTAMP.
If this column is not specified, the password order date is always
null. colFailedPasswordResets) The name of the database column with the number of failed password reset attempts for flow-based password reset. The type of this column is NUMBER
Security note: If this column is not specified, failed password reset attempts are not counted, which enables brute-force attacks.
colRoleString) The type of this column is
CHAR or VARCHAR.
Note: There are other ways to determine a user's roles (see other configuration properties). If the roles granted to a user are obtained from other tables (via foreign keys), leave this property empty and use the property
roles-query instead. rolesQuery) Col Role String, this property allows to retrieve the roles based on foreign tables.
This property defines an arbitrary SQL query that returns the roles associated with the user. Note: The statement must be such that the query returns rows consisting of one column only with the granted role!
You may use the string
${userId} to reference the user id of the authenticated user inside the SQL query. The reference may be used once or multiple times.
Example: In the following example, the user table is USER, there is role table ROLE and a table with the user-to-role mappings USER2ROLE:
roles-query="SELECT r.role_name from ROLE r, USER u, USER2ROLE u2r where u.userName = ${userId} AND u.id = u2r.user AND u2r.role = r.id"
grantRoles) This set of roles is added to the otherwise determined set of roles. Thus, it does not replace otherwise determined roles but can be used in conjunction with other methods.
colUserValid) The type of this column is either
CHAR or NUMBER. The value "0" is treated as invalid, any other value is treated as valid.
If this column is not specified, all users are considered to be valid.
colUserNotValidAfter) DATETIME or TIMESTAMP. colUserNotValidBefore) DATETIME or TIMESTAMP. colLatestSuccessfulLogin) DATETIME or TIMESTAMP. colSecondLatestSuccessfulLogin) DATETIME or TIMESTAMP. colLatestLoginAttempt) DATETIME or TIMESTAMP. colFirstLogin) DATETIME or TIMESTAMP. colUnlockAttempts) NUMBER. colLatestUnlockAttempt) DATETIME or TIMESTAMP. colSelfRegisteredFlag) CHAR or NUMBER. The value "0" is treated as false, any other value is treated as true.
If this column is not specified, it will be assumed that no users are self-registered.
colSelfRegistrationDate) DATETIME or TIMESTAMP. colChannelVerificationResends) NUMBER.
If this column is not specified, the number of allowed resend attempts is not limited.
colLastGSID) colLastGSIDDate) colSecretQuestionsEnabled) additionalWhereClause) The SQL query without an additional where clause is
SELECT * FROM usertable WHERE colusername = 'username' (real values for "usertable", "colusername" are taken from the configuration and "username" is taken from the user name input field of the login mask.
The SQL query with an additional where clause
xyz is: SELECT * FROM usertable WHERE colusername = 'username' AND xyz
. Example: If the value of this configuration setting is
"GROUP = 'cus1' AND MANDATE = 'abc'" the resulting query is SELECT * FROM usertable WHERE colusername = 'username' AND GROUP = 'cus1' AND MANDATE = 'abc'
See also property
search-condition-query: It offers a more powerful (although slightly less efficient) way to control the set of valid users. additionalIteratorWhereClause) The SQL query without an additional where clause is
SELECT colusername FROM usertable (real values for "usertable", "colusername" are taken from the configuration.
The SQL query with an additional where clause
xyz is: SELECT colusername FROM usertable WHERE xyz
. Example: If the value of this configuration setting is
"GROUP = 'cus1' AND MANDATE = 'abc'" the resulting query is SELECT colusername FROM usertable WHERE GROUP = 'cus1' AND MANDATE = 'abc'
See also property
search-condition-query: It offers a more powerful (although slightly less efficient) way to control the set of valid users. iteratorQuery) Specifying such a query is only necessary if the username cannot be used as primary key in the user table (this only if property "User Name Resolve Query" is specified).
The query must be such that it returns one-column records one username (userid) per row.
Note that his query is used both when returning all user ids and when returning only matching user ids (filtered by the user). Thus, the query must be such that LIKE-clauses against context data columns work. This usually means that you must join the result with the user table (even if the user id is not read from the usertable) so the LIKE-clauses can access the context data of the user table. Failing to do so will result in runtime SQL syntax exceptions!Note: If this property is specified, "Additional Iterator Clauses" and the deleted flag is ignored. They must be part of the query itself!
searchConditionQuery) (See also configuration property
additional-where-clause: it offers a different, slightly more efficient but less powerful way to limit the set of valid users).
After the user has been found by username (and matching the optional additional where clause as specified by configuration property
additional-where-clause) the query specified by this configuration property is executed. If the result of the query is true or 1, the user is considered valid. In all other cases, the user is not valid, i.e. the behaviour is as if the user would not exist.
The value of this configuration property can be empty (no effect) or any valid SQL query. You can use values of the user record (Record selected from table specified by configuration property user-table-name by user name and optionally additional where clause) in the query as follows: ${xxx} refers to the field (column) xxx from the selected user record.
Example: In our example the selected user record has the following values (column name = value): user_id = 'freddie', person_no = 13, ...
Further, there is a different database table PERSON which is referenced by the user table. The table PERSON has a column of type boolean called "valid" which indicates whether a person record is valid or not. Consider the following value for this configuration property: SELECT p.valid FROM PERSON p WHERE p.person_no = ${person_no}
Thus, when looking for the user record (given the username and the matching the optional additonal where part), the above query is executed where ${person_no} is substituted by the value 13 of field person_no of the selected user record.
contextDataColumns) A list of database columns that are loaded/stored in the user's context data container.
Use either an appropriately typed instance (preferred) or the legacy type using auto-detection (the default up to IAM 6.4).
additionalContextData) user-table-name by user name) in the query as follows: ${xxx} refers to the field (column) xxx from the selected user record.
Note: These context data values are read only! When fetching user records, the query will be executed for each user and the values will be added to the context data container. Modified, new or deleted values will not be written when user records are updated.
Also note that context data fields defined in configuration property context-data-columns override corresponding entries in this property.
Example:
SELECT p.mobile_no FROM person p WHERE p.person_no = ${person_no}
colDeleted) Note: If a user is deleted and this property is defined, the record is only marked as deleted and not really removed from the database! If this property is not defined and a user is deleted, the record is deleted from the database. The type of this column is either
NUMBER (recommended) or CHAR. The value "1" represents a deleted user, "0" represents a non-deleted user. colVersionId) Such a technical column is used by some applications or libraries (such as Hibernate) to implement optimistic locking.
Note that this plugin still uses its own data-based optimistic locking mechanism. It just increments the value within a transaction in order to be compliant with other components' locking mechanisms.
The column must be of an integer type. Usually a long type is used.
colRecordInsertionDate) The type of the column must be compatible with a timestamp.
Note that - if configured (see separate property) - user information may also be written to the database at the same time.
colRecordInsertionUser) Note that - if configured (see separate property) - the insertion date may also be written to the database at the same time.
colRecordModificationDate) The type of the column must be compatible with a timestamp.
Note that - if configured (see separate property) - user information may also be written to the database at the same time.
colRecordModificationUser) Note that - if configured (see separate property) - the modification date may also be written to the database at the same time.
recordModificationUser) additionalInsertData) This allows you to add arbitrary fixed or dynamic values when a new record is created. This is useful if some database fields may not be NULL but are not inserted by this plugin by default.
Caution: Make sure to appropriately escape values (e.g. use single quotes around strings). They are used as provided in the SQL insert statements. This allows calling database dependent functions (e.g. in order to get a sequence number, system date, etc).
Caution: If the columns specified here are the same as configured in the context data fields or in any "Col ..." property, remove them from the other places for this persister instance.
userChangeEventListeners) rowsetRangePattern) This property only has an effect if used in connection with a "Database User Store".
A string formatter pattern describing how to constrain the result set to a subrange of all results. Set this value in case Airlock IAM cannot determine the optimal query pattern automatically.
The first argument is the number of rows to skip (offset), and the second argument is the number of rows to return (limit).
If no pattern is set, Airlock IAM will attempt to automatically determine the query based on the database type.
Commonly used patterns:
- LIMIT %2$d OFFSET %1$d for MySQL, MariaDB, H2, HSQLDB, PostgreSQL, SQLite
- OFFSET %1$d ROWS FETCH NEXT %2$d ROWS ONLY for SQL:2008 standard, Derby, SQL Server 2012, Oracle 12c
caseSensitiveExactMatching) This property only has an effect if used in connection with a "Database User Store".
A String formatter pattern describing how to compare a string field on equality, case sensitive.If the database is already case sensitive (most DBs, except MySQL and MariaDB) the default value can be used.
The argument (%s) is the name of the field to compare, and the question mark is the value to be searched for.
Commonly used patterns:
- %s = ? – in most cases
- BINARY `%s` = ? – for MySQL and MariaDB databases with standard (case insensitive) settings
caseSensitiveMatching) This property only has an effect if used in connection with a "Database User Store".
A String formatter pattern describing how to search in a string field, case sensitive.If the database is already case sensitive (most DBs, except MySQL and MariaDB) the default value can be used.
The argument (%s) is the name of the field to compare, and the question mark is the value to be searched for. Important: This is used for approximate matching, e.g. "contains" matching, where the search value could be like "%bla%", thus the "LIKE" operator must be used instead of the equality sign.
Commonly used patterns:
- %s LIKE ? – in most cases
- %s LIKE BINARY ? – for MySQL and MariaDB databases with standard (case insensitive) settings
- %s COLLATE latin1_general_cs LIKE ? – alternative for MySQL and MariaDB, possibly more efficient, but collation must be known
caseInsensitiveExactMatching) This property only has an effect if used in connection with a "Database User Store".
A String formatter pattern describing how to compare a string database field on equality, case insensitive.If the database is already case insensitive (e.g. MySQL and MariaDB) the default value can be used.
The argument (%s) is the name of the field to compare, and the question mark is the value to be searched for. For some databases a less efficient "LIKE" operator has to be used for this.
Depending on used DB and version, as well as the specific setup, different values can be the most efficient. For large user repositories, a DB expert might be consulted or tests with different settings should be performed.
Commonly used patterns:
- LOWER( %s ) = LOWER ( ? ) – works for most DBs, tested with Oracle DB. Note that this is only really efficient, if a lower-case index is created for the relevant columns.
- %s COLLATE latin1_general_ci = ? – recommended for MSSQL.
- %s = ? – for databases with default case insensitive matching, e.g. MySQL and MariaDB with standard settings
caseInsensitiveMatching) This property only has an effect if used in connection with a "Database User Store".
A String formatter pattern describing how to compare a string database field on equality, case insensitive.If the database is already case insensitive (e.g. MySQL and MariaDB) the default value can be used.
The argument (%s) is the name of the field to compare, and the question mark is the value to be searched for. Important: This is used for approximate matching, e.g. "contains" matching, where the search value could be like "%bla%", thus the "LIKE" operator must be used instead of the equality sign.
Depending on used DB and version, as well as the specific setup, different values can be the most efficient. For large user repositories, a DB expert might be consulted or tests with different settings should be performed.
Commonly used patterns:
- LOWER( %s ) LIKE LOWER ( ? ) – works for most DBs, tested with Oracle DB. Note that this is only really efficient, if a lower-case index is created for the relevant columns.
- %s COLLATE latin1_general_ci LIKE ? – recommended for MSSQL.
- %s LIKE ? – for databases with default case insensitive matching, e.g. MySQL and MariaDB with standard settings
- %s ILIKE ? – for PostgreSQL databases
type: DatabaseUserPersister
id: DatabaseUserPersister-xxxxxx
displayName:
comment:
properties:
additionalContextData:
additionalInsertData:
additionalIteratorWhereClause:
additionalWhereClause:
caseInsensitiveExactMatching: LOWER( %s ) = LOWER ( ? )
caseInsensitiveMatching: LOWER( %s ) LIKE LOWER ( ? )
caseSensitiveExactMatching: %s = ?
caseSensitiveMatching: %s LIKE ?
colAuthMethod:
colAuthMigrationDate:
colChannelVerificationResends:
colDeleted:
colFailedLogins:
colFailedLoginsBeforeLatestLogin:
colFailedPasswordResets:
colFailedTokenCounts:
colFirstLogin:
colLastGSID:
colLastGSIDDate:
colLatestLoginAttempt:
colLatestPasswordChange:
colLatestSuccessfulLogin:
colLatestUnlockAttempt:
colNextAuthMethod:
colNextEnforcedPasswordChange:
colOtherCredentialsDeliveryTimestamps:
colPassword:
colPasswordChangeForced:
colPasswordDeliveryDate:
colPasswordGenerationDate:
colPasswordOrderedDate:
colPasswordOrderedFlag:
colPasswordOrderedUser:
colRecordInsertionDate:
colRecordInsertionUser:
colRecordModificationDate:
colRecordModificationUser:
colRoleString:
colSecondLatestSuccessfulLogin:
colSecretQuestionsEnabled:
colSelfRegisteredFlag:
colSelfRegistrationDate:
colTotalLogins:
colUnlockAttempts:
colUserLockDate:
colUserLockReason:
colUserLocked:
colUserName:
colUserNotValidAfter:
colUserNotValidBefore:
colUserValid:
colVersionId:
contextDataColumns:
defaultAuthMethod:
defaultNextAuthMethod:
grantRoles:
isPwdHashStringType: true
iteratorQuery:
recordModificationUser: Medusa
rolesQuery:
rowsetRangePattern:
searchConditionQuery:
sqlDataSource:
userChangeEventListeners:
userNameResolveQuery:
userTableName:
Database User Store
databaseUserPersister)
type: DatabaseUserStoreProvider
id: DatabaseUserStoreProvider-xxxxxx
displayName:
comment:
properties:
databaseUserPersister:
Date And Time Context Data
contextDataItemNameConfig) valueProviderConfig)
type: DateAndTimeNonInteractiveUserDataItemDefinition
id: DateAndTimeNonInteractiveUserDataItemDefinition-xxxxxx
displayName:
comment:
properties:
contextDataItemNameConfig:
valueProviderConfig:
Date And Time Context Data Item
The database column must be of a date with time type (e.g. DATETIME (TIMESTAMP on Oracle)) and the values of this context data item are guaranteed to be of type java.util.Date.
contextDataName) databaseColumnName) readonlyOnUpdate)
type: DateAndTimeContextDataItem
id: DateAndTimeContextDataItem-xxxxxx
displayName:
comment:
properties:
contextDataName:
databaseColumnName:
readonlyOnUpdate: false
Date And Time Context Data Item Name
contextDataName)
type: DateAndTimeContextDataItemName
id: DateAndTimeContextDataItemName-xxxxxx
displayName:
comment:
properties:
contextDataName:
Date And Time Context Data Value Provider
Provides the date and time value contained in the specified context data item of the user.
Make sure the configured context data item is also configured on the user persister.
contextDataField) mandatory) If enabled, the value provided by this context data item is not allowed to be null.
If this option is enabled and the context data item is null (e.g. if the configured context data is not configured on the user persister), an exception will be thrown at runtime.
type: ContextDataDateAndTimeValueProvider
id: ContextDataDateAndTimeValueProvider-xxxxxx
displayName:
comment:
properties:
contextDataField:
mandatory: false
Date And Time Data Transformer
Values which have been transformed by this transformer are guaranteed to be of type java.util.Date.
properties) Use the asterisk character ("*") to replace all properties.
pattern)
type: DateAndTimeDataTransformer
id: DateAndTimeDataTransformer-xxxxxx
displayName:
comment:
properties:
pattern:
properties:
Date And Time From Map Value Provider
If the provided value is a string, the value provider will automatically attempt to convert it to a date and time representation.
For this, the provided date-time string must be in ISO8601 format (e.g. 2025-10-27T10:02:00Z).
If the value is an incompatible type, or converting the string is impossible, an error is thrown.
valueMaps) key)
type: DateAndTimeFromMapValueProvider
id: DateAndTimeFromMapValueProvider-xxxxxx
displayName:
comment:
properties:
key:
valueMaps:
Date And Time User Context Data Item
contextDataName) required) validators) inputPurpose) The input purpose allows labeling data items using standardized values (see https://www.w3.org/TR/WCAG22/#input-purposes).
It is rendered using the HTML attribute "autocomplete". Browsers can use this to automatically fill input fields with data that was previously entered in other fields with the same purpose.
Note that the input purpose provided here will be used in the default Loginapp UI components and is available to custom single-page applications via the REST endpoints */info/retrieve.
If the Loginapp UI is used with configuration-based 'Customized Step UIs', the input purpose has to be defined on the UI elements ('Input UI Element', 'Drop-Down UI Element', 'Date UI Element').
type: DateAndTimeContextDataItemDefinition
id: DateAndTimeContextDataItemDefinition-xxxxxx
displayName:
comment:
properties:
contextDataName:
inputPurpose:
required: true
validators:
Date And Time Validator
Validate a date and time.
- If the date and time value was not specified, the corresponding error type is
REQUIRED. - If the specified date and time is before the minimum, the corresponding error type is
BEFORE_MIN_DATE. - If the specified date and time is after the maximum, the corresponding error type is
AFTER_MAX_DATE.
minRelative) The "minimum relative value" is the lower limit (earliest possible) for allowed difference in days to the current date.
Examples: A value of 1 means that tomorrow is the earliest possible date to enter, a value of -365 means that the entered date can be at most one year in the past.
minDate) The earliest date allowed to be filled in. This cannot be used together with "Minimum Relative" and must be in ISO 8601 format.
maxRelative) The "maximum relative value" is the upper limit (last possible) for allowed difference in days to the current date. This cannot be used together with "Max Date".
Examples: A value of 1 means that tomorrow is the latest possible date to enter, a value of -365 means that the entered date has to be at least one year in the past. Use this property to configure a minimal required age.
maxDate) The latest date allowed to be filled in. This cannot be used together with "Maximum Relative" and it must be in ISO 8601 format.
type: DateAndTimeValidator
id: DateAndTimeValidator-xxxxxx
displayName:
comment:
properties:
maxDate:
maxRelative:
minDate:
minRelative:
Date And Time With Offset Value Provider
dateAndTimeProvider) offsetProvider) The amount to offset Date And Time Provider by.
A positive offset will result in a later date and time than Date And Time Provider, while a negative offset will result in an earlier date and time.
unit)
type: DateAndTimeWithOffsetValueProvider
id: DateAndTimeWithOffsetValueProvider-xxxxxx
displayName:
comment:
properties:
dateAndTimeProvider:
offsetProvider:
unit:
Date Context Data
contextDataItemNameConfig) valueProviderConfig)
type: DateNonInteractiveUserDataItemDefinition
id: DateNonInteractiveUserDataItemDefinition-xxxxxx
displayName:
comment:
properties:
contextDataItemNameConfig:
valueProviderConfig:
Date Context Data Item
The database column must either be of a date type (e.g. DATE; TIMESTAMP and DATETIME will also work where supported) or of a string type (e.g. VARCHAR, CHAR (whitespaces are removed automatically)), in which case a date pattern must be specified).
The values of this context data item are guaranteed to be of type java.time.LocalDate.
contextDataName) databaseColumnName) datePatternForStringColumns) readonlyOnUpdate)
type: DateContextDataItem
id: DateContextDataItem-xxxxxx
displayName:
comment:
properties:
contextDataName:
databaseColumnName:
datePatternForStringColumns:
readonlyOnUpdate: false
Date Data Transformer
Values which have been transformed by this transformer are guaranteed to be of type java.time.LocalDate.
properties) Use the asterisk character ("*") to replace all properties.
pattern)
type: DateDataTransformer
id: DateDataTransformer-xxxxxx
displayName:
comment:
properties:
pattern:
properties:
Date Format
translationKey)
type: DateFormatValidation
id: DateFormatValidation-xxxxxx
displayName:
comment:
properties:
translationKey:
Date From Map Value Provider
If the provided value is a string, the provider will attempt to convert it to a date type.
If the format of the string does not match 'yyyy-MM-dd', or the value is an incompatible type, an error is thrown.
valueMaps) key)
type: DateFromMapValueProvider
id: DateFromMapValueProvider-xxxxxx
displayName:
comment:
properties:
key:
valueMaps:
Date From String Value Provider
The string must be of the format YYYY-MM-DD (ISO 8601)
stringValueProviderConfig)
type: DateFromStringValueProvider
id: DateFromStringValueProvider-xxxxxx
displayName:
comment:
properties:
stringValueProviderConfig:
Date UI Element
label) property) placeholder) validations) htmlId) inputPurpose) The input purpose allows labeling data items using standardized values (see https://www.w3.org/TR/WCAG22/#input-purposes).
It is rendered using the HTML attribute "autocomplete". Browsers can use this to automatically fill input fields with data that was previously entered in other fields with the same purpose.
submitToServer) initialValueQuery) See the JSONPath documentation for the full documentation: https://github.com/dchester/jsonpath
Examples:Assume the initial REST call returns the following JSON response:
{
"meta": {
"type": "jsonapi.metadata.document",
"timestamp": "2023-03-10T13:06:01.294+02:00"
},
"data": [
{
"type": "user",
"id": "user1",
"attributes": {
"contextData": {
"givenname": "User1",
"surname": "FSMTest",
"roles": "customerA"
}
}
},
{
"type": "user",
"id": "user2",
"attributes": {
"contextData": {
"givenname": "User2",
"surname": "FSMTest",
"roles": "customerB"
}
}
}
]
}
The following table shows the results of various JSONPath queries given the JSON above:
Description JSONPath Query Extracted Initial Value Static path from the root $.meta.type jsonapi.metadata.document The role of the user whose id equals "user1" $.data[?(@.id == 'user1')].attributes.contextData.roles customer The number of users $.data.length 2 All "givenname" attributesNote:
This query yields multiple results.
The first one is set to the initial value, the rest is discarded. $..givenname User1
type: ConfigurableUiDate
id: ConfigurableUiDate-xxxxxx
displayName:
comment:
properties:
htmlId:
initialValueQuery:
inputPurpose:
label:
placeholder:
property:
submitToServer: true
validations:
Date User Context Data Item
contextDataName) required) validators) inputPurpose) The input purpose allows labeling data items using standardized values (see https://www.w3.org/TR/WCAG22/#input-purposes).
It is rendered using the HTML attribute "autocomplete". Browsers can use this to automatically fill input fields with data that was previously entered in other fields with the same purpose.
Note that the input purpose provided here will be used in the default Loginapp UI components and is available to custom single-page applications via the REST endpoints */info/retrieve.
If the Loginapp UI is used with configuration-based 'Customized Step UIs', the input purpose has to be defined on the UI elements ('Input UI Element', 'Drop-Down UI Element', 'Date UI Element').
type: DateContextDataItemDefinition
id: DateContextDataItemDefinition-xxxxxx
displayName:
comment:
properties:
contextDataName:
inputPurpose:
required: true
validators:
Date User Profile Item
dateFormat) minRelative) The "minimum relative value" is the lower limit (earliest possible) for allowed difference in days to the current date.
Examples: A value of 1 means that tomorrow is the earliest possible day to enter, a value of -365 means that the entered date can be at most one year in the past.
minDate) The earliest date allowed to be filled in. This cannot be used together with "Minimum Relative" and must be in the same format as specified in "Date Format".
maxRelative) The "maximum relative value" is the upper limit (last possible) for allowed difference in days to the current date. This cannot be used together with "Max Date".
Examples: A value of 1 means that tomorrow is the latest possible day to enter, a value of -365 means that the entered date has to be at least one year in the past. Use this property to configure a minimal required age.
maxDate) The latest date allowed to be filled in. This cannot be used together with "Maximum Relative" and it must be in the same format as specified in "Date Format".
dateTransformation) - DATE: the date value is transformed to a java.util.Date object (date with time, where all time values are set to 0).
Use 'Date And Time Context Data Item Config' for the corresponding context data item in the persister. - LOCAL_DATE: the date value is transformed to a java.time.LocalDate object (date only).
Use 'Local Date Context Data Item Config' for the corresponding context data item in the persister. - STRING: the date value is transformed to a String as defined by "Date Format".
Use 'String Context Data Item Config' for the corresponding context data item in the persister.
stringResourceKey) propertyName) optional) modifiable) validateOnlyChangedValues) sortable)
type: DateUserProfileItem
id: DateUserProfileItem-xxxxxx
displayName:
comment:
properties:
dateFormat: dd.MM.yyyy
dateTransformation: LOCAL_DATE
maxDate:
maxRelative:
minDate:
minRelative:
modifiable: true
optional: true
propertyName:
sortable: true
stringResourceKey:
validateOnlyChangedValues: true
Date Validator
Validate a date.
- If the date was not specified, the corresponding error type is
REQUIRED. - If the specified date is before the minimum, the corresponding error type is
BEFORE_MIN_DATE. - If the specified date is after the maximum, the corresponding error type is
AFTER_MAX_DATE.
minRelative) The "minimum relative value" is the lower limit (earliest possible) for allowed difference in days to the current date.
Examples: A value of 1 means that tomorrow is the earliest possible date to enter, a value of -365 means that the entered date can be at most one year in the past.
minDate) The earliest date allowed to be filled in. This cannot be used together with "Minimum Relative" and must be in ISO 8601 format.
maxRelative) The "maximum relative value" is the upper limit (last possible) for allowed difference in days to the current date. This cannot be used together with "Max Date".
Examples: A value of 1 means that tomorrow is the latest possible date to enter, a value of -365 means that the entered date has to be at least one year in the past. Use this property to configure a minimal required age.
maxDate) The latest date allowed to be filled in. This cannot be used together with "Maximum Relative" and it must be in ISO 8601 format.
type: DateValidator
id: DateValidator-xxxxxx
displayName:
comment:
properties:
maxDate:
maxRelative:
minDate:
minRelative:
Date-Time From String Value Provider
stringValueProvider) Examples of strings supported by the default formats:
- 2011-12-03T10:15:30+01:00
- 2011-12-03T10:15:30+0100
- 2011-12-03T10:15:30+01
- 2011-12-03T10:15:30.000+01:00
- 2011-12-03T10:15:30.000+0100
- 2011-12-03T10:15:30.000+01
- 2011-12-03T10:15:30Z
- 2011-12-03T10:15:30.000Z
formats) The date and time formats used to parse the value provided by String Value Provider.
The format is interpreted as specified in the java.text.SimpleDateFormat documentation.
Each format is tried sequentially, until a format matches. One of the formats must match, else an exception is thrown.
type: DateAndTimeFromStringValueProvider
id: DateAndTimeFromStringValueProvider-xxxxxx
displayName:
comment:
properties:
formats: [yyyy-MM-dd'T'HH:mm:ssX, yyyy-MM-dd'T'HH:mm:ss.SSSX]
stringValueProvider:
Date/Time Input Token Controller Element
label) property) The referenced property must be available in the attributes value of the generic token REST call response. If the property is nested, e.g. inside the contextData key, it can be referenced with dot notation (see example values).
The ID of the response is referenced by using the reserved value @id.
placeholder) required) dateOnly) readOnly) hideIfEmpty)
type: DateInputTokenControllerUiElement
id: DateInputTokenControllerUiElement-xxxxxx
displayName:
comment:
properties:
dateOnly: false
hideIfEmpty: false
label:
placeholder:
property:
readOnly: false
required: false
Default Account Link Linking Flow
Simple configuration for an account link linking self-service flow.
The following steps are automatically generated:
- An Account Link Linking Initiation Step.
- An Apply Changes Step
If more advanced features are needed, a Custom Protected Self-Service Flow can be configured.
flowId) accessCondition) Precondition that must be fulfilled for a user to access this flow.
Note the difference to the "Authorization Condition":- Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
authorizationCondition) - Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
type: DefaultAccountLinkLinkingFlow
id: DefaultAccountLinkLinkingFlow-xxxxxx
displayName:
comment:
properties:
accessCondition:
authorizationCondition:
flowId:
Default Account Link Removal Flow
Simple configuration for an account link removal self-service flow.
The following steps are automatically generated:
- An Account Link Removal Initiation Step.
- An Apply Changes Step
If more advanced features are needed, a Custom Protected Self-Service Flow can be configured.
flowId) accessCondition) Precondition that must be fulfilled for a user to access this flow.
Note the difference to the "Authorization Condition":- Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
authorizationCondition) - Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
type: DefaultAccountLinkDeletionFlow
id: DefaultAccountLinkDeletionFlow-xxxxxx
displayName:
comment:
properties:
accessCondition:
authorizationCondition:
flowId:
Default Aggregate Report Strategy
| Key | Value |
|---|---|
| aggr_count | <number of reports> |
| aggr_langs | <List of all languages> |
| aggr_filenames | <List of all file names> |
| <key Param1> | <List of all Param1 values> |
| <key Param1>.aggr_first | <Value of this parameter in the first report. > |
| <key Param1>.aggr_last | <Value of this parameter in the last report. > |
All parameters passed to the reports are listed as <key Param1>. All the lists are in the same order of reports as they have been genereated (first generated report at position 0).
type: DefaultAggregateReportStrategy
id: DefaultAggregateReportStrategy-xxxxxx
displayName:
comment:
properties:
Default Authentication Processor
updateLoginStatistics) Login statistics (timestamps, login counts, etc.) are updated whenever a user successfully completes the first authentication flow of a session. Upon completing additional authentication flows in the same session (e.g. step-ups), the statistics are not updated.
If disabled, the login statistics are never updated when completing this flow.
type: DefaultAuthenticationProcessor
id: DefaultAuthenticationProcessor-xxxxxx
displayName:
comment:
properties:
updateLoginStatistics: true
Default Authentication Processors
This plugin automatically configures a list of essential flow processors for authentication flows.
The processors are configured in this order:
- CAPTCHA Processor
- User Identification Processor
- Latest Authentication Feedback Processor (only if enabled)
- Default Authentication Processor
- Factor Use Reporting Processor
- Failed Factor Attempts Processor (with strict counting)
- Renew Session ID Processor
- User Validity Processor
- Login History Processor (only if enabled)
- Unlock Attempts Reset Processor
- Device Usage Processor
- Set UI Tenant ID Processor
addLatestAuthenticationFeedback) The latest authentication information is provided in all flow step results (REST responses) after successfully identifying the user. In addition, the Loginapp UI displays this information on selected second factor pages.
Note: If an authentication flow starts with a user identifying step without verification of an authentication factor (e.g. password, remember-me cookie, SSO ticket, ...) this may lead to unwanted information leakage.
writeLoginHistory) updateLoginStatistics) Login statistics (timestamps, login counts, etc.) are updated whenever a user successfully completes the first authentication flow of a session. Upon completing additional authentication flows in the same session (e.g. step-ups), the statistics are not updated.
If disabled, the login statistics are never updated when completing this flow.
type: DefaultAuthenticationProcessors
id: DefaultAuthenticationProcessors-xxxxxx
displayName:
comment:
properties:
addLatestAuthenticationFeedback: false
updateLoginStatistics: true
writeLoginHistory: false
Default Authorization Processors
- User Validity Processor
- Factor Use Reporting Processor
type: DefaultAuthorizationProcessors
id: DefaultAuthorizationProcessors-xxxxxx
displayName:
comment:
properties:
Default Cronto Device Removal Flow
Simple configuration for a Cronto device removal self-service flow.
The following steps are automatically generated:
- A Delete Cronto Device Initiation Step.
- An Apply Changes Step
The access condition for the flow is always a Cronto Device Removal Possible.
If more advanced features are needed, a Custom Protected Self-Service Flow can be configured.
flowId) crontoHandler) allowDeletingLastDevice) authorizationCondition) - Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
type: DefaultCrontoDeviceDeletionFlow
id: DefaultCrontoDeviceDeletionFlow-xxxxxx
displayName:
comment:
properties:
allowDeletingLastDevice: false
authorizationCondition:
crontoHandler:
flowId:
Default Cronto Device Renaming Flow
Simple configuration for a Cronto device renaming self-service flow.
The following steps are automatically generated:
- A Cronto Device Selection Step.
- A Rename Cronto Device Step.
- An Apply Changes Step
If more advanced features are needed, a Custom Protected Self-Service Flow can be configured.
flowId) crontoHandler) accessCondition) Precondition that must be fulfilled for a user to access this flow.
Note the difference to the "Authorization Condition":- Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
authorizationCondition) - Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
type: DefaultCrontoDeviceRenamingFlow
id: DefaultCrontoDeviceRenamingFlow-xxxxxx
displayName:
comment:
properties:
accessCondition:
authorizationCondition:
crontoHandler:
flowId:
Default Cronto Login Message Provider
Provides the default Cronto login message.
This plugin configures a Generic Cronto Message Provider for the translation string cronto.login-message with the two value map providers for the user's context-data and user statistics.
crontoHandler)
type: DefaultCrontoLoginMessageProvider
id: DefaultCrontoLoginMessageProvider-xxxxxx
displayName:
comment:
properties:
crontoHandler:
Default Disable Cronto Device Flow
Simple configuration for a self-service flow to disable a Cronto device.
The following steps are automatically generated:
- A Disable Cronto Device Initiation Step.
- An Apply Changes Step
If more advanced features are needed, a Custom Protected Self-Service Flow can be configured.
flowId) crontoHandler) accessCondition) Precondition that must be fulfilled for a user to access this flow.
Note the difference to the "Authorization Condition":- Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
authorizationCondition) - Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
type: DefaultCrontoDeviceDisablingFlow
id: DefaultCrontoDeviceDisablingFlow-xxxxxx
displayName:
comment:
properties:
accessCondition:
authorizationCondition:
crontoHandler:
flowId:
Default Disable Cronto Push Flow
Simple configuration for a self-service flow to disable Cronto push notification.
The following steps are automatically generated:
- A Disable Cronto Push Initiation Step.
- An Apply Changes Step
If more advanced features are needed, a Custom Protected Self-Service Flow can be configured.
flowId) crontoHandler) accessCondition) Precondition that must be fulfilled for a user to access this flow.
Note the difference to the "Authorization Condition":- Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
authorizationCondition) - Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
type: DefaultCrontoPushDisablingFlow
id: DefaultCrontoPushDisablingFlow-xxxxxx
displayName:
comment:
properties:
accessCondition:
authorizationCondition:
crontoHandler:
flowId:
Default Disable FIDO Credential Flow
Simple configuration for a self-service flow to disable a FIDO credential.
The following steps are automatically generated:
- A Disable FIDO Credential Initiation Step.
- An Apply Changes Step
If more advanced features are needed, a Custom Protected Self-Service Flow can be configured.
flowId) fidoSettings) accessCondition) Precondition that must be fulfilled for a user to access this flow.
Note the difference to the "Authorization Condition":- Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
authorizationCondition) - Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
type: DefaultFidoCredentialDisablingFlow
id: DefaultFidoCredentialDisablingFlow-xxxxxx
displayName:
comment:
properties:
accessCondition:
authorizationCondition:
fidoSettings:
flowId:
Default Enable Cronto Device Flow
Simple configuration for a self-service flow to enable a Cronto device.
The following steps are automatically generated:
- A Enable Cronto Device Initiation Step.
- An Apply Changes Step
If more advanced features are needed, a Custom Protected Self-Service Flow can be configured.
flowId) crontoHandler) accessCondition) Precondition that must be fulfilled for a user to access this flow.
Note the difference to the "Authorization Condition":- Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
authorizationCondition) - Access Condition: This condition determines whether a user is allowed to access a service at all. If this condition is not fulfilled, there is nothing that can be done (at least not immediately). Typical examples include having a certain authentication token, or a certain static role. This condition is always checked before the Authorization Condition and if it fails, the REST response has status 403 with error code PRECONDITION_NOT_FULFILLED.
- Authorization Condition: This condition determines whether the user is currently authorized to access a service. It is expected that completing another authentication flow (step-up) would enable the user to then fulfill the condition. The typical authorization condition checks whether the user has obtained a certain tag (or combination of tags). If the condition fails, the REST response has status 403 with error code NOT_AUTHORIZED.
type: DefaultCrontoDeviceEnablingFlow
id: DefaultCrontoDeviceEnablingFlow-xxxxxx
displayName:
comment:
properties:
accessCondition:
authorizationCondition:
crontoHandler:
flowId:
Default Enable Cronto Push Flow
Simple configuration for a self-service flow to enable Cronto push notification.
The following steps are automatically generated:
- A Enable Cronto Push Initiation Step.
- An Apply Changes Step
If more advanced features are needed, a Custom Protected Self-Service Flow can be configured.