What’s new
What’s new in PingGateway 2024.9
OpenTelemetry capabilities
This release adds the ability to push traces to an OpenTelemetry service.
These capabilities are available in Technology preview. They aren’t yet supported, may be functionally incomplete, and are subject to change without notice. |
Learn more in the following documentation:
Multiple versions of a secret with FileSystemSecretStore
With the new FileSystemSecretStore versionSuffix
setting you can have multiple versions of a secret with the same ID.
For details, refer to FileSystemSecretStore.
Replace setting for HeaderFilter
Use the new HeaderFilter replace
setting to replace headers instead of removing then adding them.
For details, refer to HeaderFilter.
Runtime exception condition for retries
The new runtimeExceptionCondition
setting lets you restrict which runtime exceptions lead to retries.
Learn more in ClientHandler and ReverseProxyHandler.
Security provider setting for keystores
The new securityProvider
setting lets you choose the Java security provider to use when loading a keystore.
Learn more in KeyStoreSecretStore.
Delayed route metrics creation
The new delayRouteMetrics
setting lets you defer creation of route metrics until a request passes through the route.
This can improve startup times for deployments with many routes.
Learn more in Router.
Separate endpoint for administration
PingGateway now lets you configure a separate endpoint for administrative connections. PingGateway is expected to require a separate administrative endpoint in a future release.
For details, refer to
AdminHttpApplication (admin.json
).
New PingOne Authorize example
The documentation now includes an example showing how to protect a web application with help from PingOne Authorize.
Learn more in PingOne Authorize integration.
What’s new in PingGateway 2024.6
IG becomes PingGateway
Product names changed when ForgeRock became part of Ping Identity. PingGateway was formerly known as ForgeRock Identity Gateway, for example. Learn more about the name changes from New names for ForgeRock products in the Knowledge Base.
PingOne Protect integration
You can now use PingOne Protect risk evaluations to help protect web applications. Configure PingGateway routes to react dynamically to risk scores from PingOne Protect.
PingOne Protect integration is available in Technology preview. It isn’t yet supported, may be functionally incomplete, and is subject to change without notice. |
Learn more from PingOne Protect integration.
Changes to the Prometheus Scrape Endpoint
To facilitate consumption of Prometheus metrics, the format
of some metrics has been updated and the new format is available on the
new endpoint …/openig/metrics/prometheus/0.0.4
.
The old format and endpoint are deprecated, but for backward compatibility, they remain enabled and available by default.
The new property serveDeprecatedPrometheusEndpoint
in
AdminHttpApplication
is available to deliver Prometheus metrics in the deprecated format. It is enabled by default.
Learn more from Metrics at the Prometheus Scrape Endpoint.
New metrics at the Prometheus Scrape Endpoint
Startup and Websocket metrics are now available at the Prometheus Scrape Endpoint. Learn more from Startup metrics at the Prometheus Scrape Endpoint and WebSocket metrics at the Prometheus Scrape Endpoint.
PingOneApiAccessManagementFilter now supported
The PingOneApiAccessManagementFilter is now supported for general use.
Hardened security for OpenID Connect ID tokens
PingGateway now supports OpenID Connect ID token validation according to the OpenID Connect specifications.
For this release, signature validation is optional. The next major release is expected to make ID token signature validation required.
The following new properties enable validation of the ID token signatures and the
iss
, aud
, exp
, iat
, and nonce
claims:
-
-
skipSignatureVerification
-
clientSecretUsage
In addition, use the
clientSecretId
andsecretsProvider
properties for HMAC-based signature validation. -
-
-
issuer
-
secretsProvider
-
idTokenVerificationSecretId
-
idTokenSkewAllowance
-
Learn more from ClientRegistration configurations and Issuer configurations in Incompatible changes.
What’s new in IG 2024.3
Local authentication on behalf of PingOne Advanced Identity Cloud and Kerberos validation
The following new objects are available for local processing on behalf of PingOne Advanced Identity Cloud as part of an PingOne Advanced Identity Cloud journey:
-
KerberosIdentityAssertionPlugin and the service objects UsernamePasswordServiceLogin and KeytabServiceLogin.
These objects exist alongside the Technical Preview objects IdentityAssertionHandlerTechPreview, ScriptableIdentityAssertionPluginTechPreview, and IdentityAssertionPluginTechPreview introduced in the last release.
Monitoring of caches
Monitoring metrics are now available at the Prometheus Scrape Endpoint and Common REST Monitoring Endpoint for the caches described in Caches.
Learn more from Cache metrics at the Prometheus Scrape Endpoint.
Use of secrets in Studio
IG now uses secrets instead of deprecated passwords. Learn about how IG manages migration in Upgrade from an earlier version of Studio.
Use of Splunk or ElasticSearch audit event handlers in Studio
IG Studio no longer uses the deprecated Splunk or ElasticSearch audit event handlers. Learn about how IG manages migration in Upgrade from an earlier version of Studio.
Hardened security for secrets
With PingOne Advanced Identity Cloud and from AM 7.5, passwords hardcoded in the identity provider configuration can optionally be managed by the identity provider’s secret service. These passwords include the IG agent passwords and OAuth 2.0 client passwords.
IssuerRepository
An IssuerRepository is provided as a default object. Learn more from Default objects.
Dedicated filter for PingOne’s API Access Management (Technology preview)
PingOneApiAccessManagementFilter is a new filter dedicated to PingOne’s API Access Management. Use this filter with API Access Management to evaluate HTTP requests and responses.
The PingOneApiAccessManagementFilter is available in Technology preview. It isn’t yet supported, may be functionally incomplete, and is subject to change without notice. |
What’s new in IG 2023.11.1
IG 2023.11.1 is a maintenance version to fix issues listed in Fixed in 2023.11.1. It contains no new features.
What’s new in IG 2023.11
Harden OAuth 2.0 access token requests
GrantSwapJwtAssertionOAuth2ClientFilter is a new filter to transform requests for OAuth 2.0 access tokens into secure JWT bearer grant type requests.
Use this filter with PingOne Advanced Identity Cloud or AM to increase the security of less-secure grant-type requests such as Client credentials grant or Resource owner password credentials grant.
For more information, refer to Secure the OAuth 2.0 access token endpoint.
Include key ID in JWT header
The new property includeKeyId
is available in
JwtBuilderFilter to
include the ID of the signature key in the header of a built JWT.
Local processing on behalf of PingOne Advanced Identity Cloud (Technology preview)
The following new objects are available for local processing on behalf of PingOne Advanced Identity Cloud as part of an PingOne Advanced Identity Cloud journey:
The IdentityAssertionHandlerTechPreview, ScriptableIdentityAssertionPluginTechPreview, and IdentityAssertionPluginTechPreview are available in Technology preview. They aren’t yet supported, may be functionally incomplete, and are subject to change without notice. |
Secret format JwkPropertyFormat
JwkPropertyFormat is a new secret format. Use it with FileSystemSecretStore to decode JSON Web Key (JWK) formatted keys into secrets.
More flexible use of CA-certificates in mutual TLS
The new property certificateVerificationSecretId
is available in
SecretsTrustManager to
facilitate the use of CA-certificates in mutual TLS. In previous releases, the
use of CA-signed certificates was more restricted.
Safeguard against accidental exposure of private keys with JwkSetHandler
The new property exposePrivateSecrets
is available in
JwkSetHandler
to safeguard against the accidental exposure of private keys in a JWK set.
The property is false
by default to prevent exposure of private keys.
To expose private keys, you must now explicitly set the property to true
.
SAML
Prevention of redirect loops when session cookies are not present in the SAML flow
In
SamlFederationFilter,
the new property redirectionMarker
is enabled by default to prevent redirect
loops when a session cookie isn’t present in the SAML flow.
When the marker is present in the request query parameters, the request isn’t redirected for authentication.
What’s new in IG 2023.9
Revocation of access tokens initiated by OAuth 2.0 Resource Servers
The following new properties have been added in AuthorizationCodeOAuth2ClientFilter and Issuer:
-
AuthorizationCodeOAuth2ClientFilter:revokeOauth2TokenOnLogout
-
Issuer:revocationEndpoint
In OpenID Connect, use these properties to revoke access and refresh tokens issued by Authorization Servers during login.
Logout initiated by OpenID Connect relying parties
The following new properties have been added in AuthorizationCodeOAuth2ClientFilter and Issuer:
-
AuthorizationCodeOAuth2ClientFilter:openIdEndSessionOnLogout
-
Issuer:endSessionEndpoint
In OpenID Connect, use these properties to initiate logout from Authorization Servers.
Option to require the Authorization Server to prompt the end-user to reauthenticate and consent
A new property prompt
is available in AuthorizationCodeOAuth2ClientFilter.
Use the property in OIDC flows to require the Authorization Server to prompt the end user to reauthenticate and consent.
Improved error handling for AuthorizationCodeOAuth2ClientFilter
When an OAuth 2.0 authorization operation fails, the AuthorizationCodeOAuth2ClientFilter injects the error and error description into the OAuth2FailureContext. In previous releases, OAuth2FailureContext was used only for the OAuth2TokenExchangeFilter.
New context for use with AuthorizationCodeOAuth2ClientFilter to retrieve the original target URI for a request
In AuthorizationCodeOAuth2ClientFilter, retrieve the original target URI for a request from the new context IdpSelectionLoginContext.
Improved security for CrossDomainSingleSignOnFilter
When verificationSecretId
in CrossDomainSingleSignOnFilter isn’t configured,
IG discovers and uses the AM JWK set to verify the signature
of AM session tokens. If the JWK set isn’t available, IG
doesn’t verify the tokens.
In earlier releases, IG did not verify the tokens when
verificationSecretId
in CrossDomainSingleSignOnFilter wasn’t configured.
To minimize the risk of CDSSO token tampering, always configure
verificationSecretId
in CrossDomainSingleSignOnFilter.
What’s new in IG 2023.6
Large JWT session cookies are automatically split
In stateless sessions, if the JWT session cookie exceeds 4 KBytes, IG automatically splits it into multiple cookies.
If your JWT session size is too close to the value of connectors:maxTotalHeadersSize
in AdminHttpApplication,
IG might block your next request containing split JWT session cookies.
Consider increasing the value of connectors:maxTotalHeadersSize
.
For more information, refer to Stateless sessions.
JWT session cookies not compressed by default
To improve security, JWT session cookies are no longer compressed by default.
For more information, refer to the useCompression
property of JwtSession.
Startup allowed if there is an existing PID file
Startup can now be allowed when there is an existing PID file. When activated, IG removes the existing PID file and creates a new one during startup. In previous releases, if there was an existing PID file during startup, the startup failed.
Activate the feature in the following ways:
-
By the new property
pidFileMode
in AdminHttpApplication. -
With the new configuration token
ig.pid.file.mode
.
For more information, refer to Allow startup when there is an existing PID file
in the Installation guide and ig.pid.file.mode
in the Deployment guide.
Prevention of redirect loops when session cookies are not present in the CDSSO flow
In CrossDomainSingleSignOnFilter, the new property redirectionMarker
is enabled by default to prevent redirect
loops when the session cookie is not present in the CDSSO flow.
When the marker is present in the request query parameters, the request is not redirected for authentication.
Regex-based alias selection in KeyStoreSecretStore and HsmSecretStore
The new property mappings:aliasesMatching
in KeyStoreSecretStore and HsmSecretStore is
available to map all aliases that match a regular expression to a secret ID.
Some KeyStores, such as a global Java TrustStore, can contain hundreds of valid certificates. Use this property to map multiple aliases to a secret ID without listing them all in the mapping.
Entity of StaticResponseHandler can be an array of strings
To improve readability, the entity
property of a StaticResponseHandler
can now be defined as an array of strings or as a string.
Maximum size for the sum of all request headers
The new property connectors:maxTotalHeadersSize
in AdminHttpApplication
defines the maximum size in bytes of the sum of all headers in a request.
This property replaces the deprecated Vert.x properties maxHeaderSize
and initialSettings:maxHeaderListSize
.
Support for unencoded policy advices
To support SDK in legacy installations, a new property useLegacyAdviceEncoding
in the
PolicyEnforcementFilter is available to provide unencoded advices.
By default, advices are encoded with the encoder used by the AM version.
The use of this property is deprecated and should be used only to support SDK in legacy installations.
Configure forward proxies for WebSocket connections
websocket:proxyOptions
is a new property in ReverseProxyHandler
to provide a dedicated WebSocket reverse proxy.
Improved control of WebSocket connections to AM
The following properties are now available in AmService to improve control of WebSocket connections to AM:
-
notifications:connectionTimeout
-
notifications:idleTimeout
-
notifications:vertx
What’s new in IG 2023.4
Authentication of IG agent to PingOne Advanced Identity Cloud and AM
IG agents are automatically authenticated to PingOne Advanced Identity Cloud and AM by a non-configurable authentication module. Authentication chains and modules are deprecated in PingOne Advanced Identity Cloud and AM. They are replaced by trees and journeys.
You can now authenticate IG agents to PingOne Advanced Identity Cloud and AM 7.3 with a journey. The procedure is currently optional, but will be required when authentication chains and modules are removed in a future release.
For more information, refer to Authenticate an IG agent to PingOne Advanced Identity Cloud and Authenticate an IG agent to AM.
Policy advices from PingOne Advanced Identity Cloud and AM available in a header
By default, when PingOne Advanced Identity Cloud or AM denies a request with advices, IG returns a redirect response with advices as parameters.
From this release, when the request includes the x-authenticate-response
header
with the value header
, IG returns the response with the advices in
a WWW-authentication
header.
Use this method for SDKs and single page applications. Placing advices in a header gives these applications more options for handling the advices.
For information about how the header is used in policy enforcement, refer to Deny requests with advices in a header.
The x-authenticate-response
header name can be configured by the new property
authenticateResponseRequestHeader
in PolicyEnforcementFilter.
SAML
The SamlFederationHandler is deprecated and replaced by the SamlFederationFilter.
The SamlFederationFilter can be used in a route protect a downstream application in the same way as other authentication triggering filters, such as the SingleSignOnFilter or CrossDomainSingleSignOnFilter.
When triggered, the SamlFederationFilter can initiate the login or logout of a SAML service provider with a SAML identity provider.
WebSocket connection renewal
IG can now automatically renew WebSocket connections to AM
after a defined delay. For more information, refer to the
notifications.renewalDelay
property of AmService.
Limit side effects when backend applications are slow
ClientHandler and ReverseProxyHandler have a
new property waitQueueSize
to set the maximum number of outbound requests
allowed to queue when no downstream connections are available. Use this property
to limit memory use when there is a backlog of outbound requests, for example,
when the protected application or third-party service is slow.
In previous releases, the queue size was unlimited. In this release, by default
it is limited to the square of the value of the connections
property.
Route ID included access audit events
The name and ID of a route is now included by default in access audit events. For more information about auditing, refer to Auditing your deployment.
What’s new in IG 2023.2
Session eviction
AM 7.3 can be configured to invalidate sessions based on user ID, and
send a notification with the topic /agent/session.v2
to IG.
IG can now use the notification to evict all sessions bound to the
user.
This feature requires AM 7.3, which will be available after the IG 2023.2 release. |
Preserve POST data during authentication
The DataPreservationFilter triggers POST data preservation when an unauthenticated client posts HTML form data to a protected resource.
For more information, refer to DataPreservationFilter and POST data preservation.
Prevent unnecessary session expiry
When the AmService property sessionIdleRefresh
is enabled, IG now requests session
refresh:
-
The first time IG gets an SSO token from AM, irrespective of the age of the token
-
When
sessionIdleRefresh.interval
has elapsed
In previous releases, IG requested session refresh only after
sessionIdleRefresh.interval
elapsed. If IG got an SSO token
that was close to its maximum idle time, the token could expire before
sessionIdleRefresh.interval
elapsed and IG triggered a refresh.
CapturedUserPasswordFilter supports secret rotation
When relying on a SecretsProvider to retrieve the shared key required by the CapturedUserPasswordFilter, you can now rotate a secret without reloading the filter if the underlying secret store supports secret rotation.
KeyStoreSecretStore allows unprotected KeyStores
KeyStoreSecretStore can now use KeyStores that are not password-protected. In previous releases, KeyStores had to be password-protected.
Delay destroying HttpClientHandlerHeaplets during shutdown
When IG is cleanly shut down, the destruction of HttpClientHandlerHeaplets is now delayed until after all other IG heaplets are destroyed. This change allows the other IG heaplets to use HttpClientHandlerHeaplets during shut down. For example, AmService can now call logout on any agent tokens it has allocated, which can help to reduce the build up of tokens in AM.
ClientHandlers and ReverseProxyHandlers are examples of HttpClientHandlerHeaplets.
Automatic reload of FileSystemSecretStore and KeystoreSecretStore
A new property autoRefresh
is available in FileSystemSecretStore and KeyStoreSecretStore
to configure automatic reloaded of the secret store when a file in the filesystem
is edited or deleted, or a keystore is edited or deleted.
Groovy 4
IG now uses Groovy 4 for scripting. For more information, refer to Release notes for Groovy 4.0
Expression binding now
The expression binding now
gives the time since epoch at the instant the
expression is evaluated. For more information, refer to Dynamic bindings.
What’s new in IG 7.2
Token exchange
Token exchange filter
OAuth2TokenExchangeFilter is a new filter to exchange a client’s access token or ID token for a new token with increased or reduced scopes, while preserving the original token subject
Connectivity with OAuth 2.0-protected third-party services
OAuth2ClientFilter renamed as AuthorizationCodeOAuth2ClientFilter.
IG provides several client authentication filters, which protect resources by using different types of information and credentials. To make it easier to differentiate between these filters, the OAuth2ClientFilter has been renamed as AuthorizationCodeOAuth2ClientFilter. For backward compatibility, the name OAuth2ClientFilter can still be used in routes.
The following client authentication filters are available to authenticate clients:
-
AuthorizationCodeOAuth2ClientFilter, using OAuth 2.0 delegated authorization
-
ClientCredentialsOAuth2ClientFilter, using the client’s OAuth 2.0 credentials
-
ResourceOwnerOAuth2ClientFilter, using the resource owner’s password credentials
ClientCredentialsOAuth2ClientFilter uses client_secret_basic
or client_secret_post
The ClientCredentialsOAuth2ClientFilter can now obtain a
client’s access token, using the token endpoint authentication method
client_secret_post
. In previous releases, it could use only client_secret_basic
.
Client authentication is now provided by the endpointHandler
property of
ClientCredentialsOAuth2ClientFilter, which uses ClientSecretBasicAuthenticationFilter
or ClientSecretPostAuthenticationFilter. In previous releases, it was provided
by the now deprecated properties clientId
and clientSecretId
.
ResourceOwnerOAuth2ClientFilter for services to access resources protected by OAuth 2.0.
A new filter ResourceOwnerOAuth2ClientFilter is available for services to access resources protected by OAuth 2.0, using the Resource Owner Password Credentials grant type.
Filters to support OAuth 2.0 client authentication
When processing requests or responses, IG can require access to systems such as the PingOne Advanced Identity Cloud to query user information. The following filters have been added to faciliate OAuth 2.0 client authentication to these systems, where IG is the client:
Use these filters with the following objects:
OAuth 2.0 session sharing across routes
The property oAuth2SessionKey
has been added to
AuthorizationCodeOAuth2ClientFilter to allow multiple
applications to share the same OAuth 2.0 session.
After a resource owner gives one application protected by IG consent to use its data, they don’t need to give consent for another application protected by IG.
In previous releases, the OAuth 2.0 session was bound to the full URI of the client callback, containing the IG hostname. So it was not possible to use the same OAuth 2.0 session to access different applications.
Circuit breaking
CircuitBreakerFilter
CircuitBreakerFilter is a new filter to monitor for failures. When the failures reach a specified threshold, the CircuitBreakerFilter prevents further calls to downstream filters and returns a runtime exception.
Circuit breaker in ClientHandler and ReverseProxyHandler
A new property circuitBreaker
has been added to
ClientHandler and ReverseProxyHandler
to provide a circuit breaker service when the number of failures reaches a
configured threshold.
Stability
JwtBuilderFilter produces encrypted JWT
The JwtBuilderFilter now produces encrypted JWTs, in addition to unsigned JWTs, signed JWTs, and signed then encrypted JWTs.
JwtSession cookie compression
The property useCompression
has been added to
JwtSession.
When a session stores large items, such as tokens, use the default value true
to reduce size of the cookie that stores the JWT.
Other
Windows start script for IG in standalone mode
A script is now provided to start IG in standalone mode on Windows.
Stop scripts for IG in standalone mode
Scripts are now provided to stop IG in standalone mode, on Unix/OS X and Windows.
IG_OPTS
environment variables for startup
IG_OPTS
is a new environment variable to separate Java runtime options for
IG startup and stop scripts with IG in standalone mode. Use
IG_OPTS
instead of JAVA_OPTS
for all options that are not shared with the
stop script.
SNI to serve different certificates for TLS Connections to different server names
In ServerTlsOptions, sni
is a
new property to serve different secret key and certificate pairs for TLS
connections to different server names in the deployment.
In previous releases, only the keyManager
property was available to serve the
same secret key and certificate pair for TLS connections to all server names.
Use this property when IG is acting server-side, to front multiple services or websites on the same port of a machine.
IG proxies all WebSocket subprotocols by default
In previous releases, for IG in standalone mode it was necessary to list
the WebSocket subprotocols that were proxied by IG, with the vertx
property of
admin.json.
From this release, IG proxies all WebSocket subprotocols by default; it is not neccessary to specify protocols. If you do specify protocols, IG supports only those protocols and no others.
Configurable conditions for retries in ClientHandler and ReverseProxyHandler
condition
is a new property in the retries
configuration of ClientHandler
and ReverseProxyHandler. Use this property to configure a condition on
which to trigger a retry. In previous releases, a retry could be triggered only
for runtime exceptions.
User ID in audit logs
Audit logs can now include a user ID. Example scripts and setup information is provided in Recording user ID in audit events.
Tracking ID logged in access audit events
In routes containing an OAuth2ResourceServerFilter, OAuth 2.0 token tracking IDs are now logged in access audit events.
Transformation from string to placeholder string
The $string
transformation has been added to facilitate the transformation from
a string to a placeholder string, which is not encoded. Use this transformation
for placeholder strings that that must not be encrypted, for example, when they
reference a secret value.
For more information, see string in Token Transformation.
Use expressions to configure paths in UriPathRewriteFilter
The mapping
object in UriPathRewriteFilter now uses configuration expressions
to define the fromPath
and toPath
. In previous releases, the mapping
object was a static JSON map.
For more information, see UriPathRewriteFilter.
PolicyDecisionContext includes actions from the policy decision response
Actions from the AM policy decision response are now available in the PolicyDecisionContext, and available for use.
The resource value that was used when making the policy request is now available in PolicyDecisionContext.
AmService detects AM version
AmService now reads the AM
version from the AM endpoint, and uses the discovered version instead of
the value configured in the AmService property version
.
The property version
is used only if AmService cannot discover the AM
version.
Certificate issued by a trusted CA for any hostname or domain is accepted for a connection to any domain
When IG is acting as a WebSocket proxy, and the downstream application
is on HTTPS, the WebSocket configuration host can now allow a certificate
issued by a trusted CA for any hostname or domain to be accepted for a connection
to any domain. For information, see the hostnameVerifier
property of
ClientTlsOptions.
Product information in startup logs
Key product information, such as the product version and build number, is now included in the startup logs.
Improved error handling in ScriptableFilter and ScriptableHandler
The ScriptableFilter and ScriptableHandler now propagate script exceptions as runtime exceptions in the promise flow. In previous releases, they replaced the exception with a response, with HTTP status 500. Users didn’t know if the response was from the requested endpoint or caused by an exception in the chain.
AmService Websocket connections protected from timeout
A heartbeat can be configured on the AmService WebSocket notification service to prevent Websocket connections from being closed for timeout.
Timeout of idle AM sessions
A new filter AmSessionIdleTimeoutFilter is available to force the revocation of AM sessions that have been idle for a specified timeout.
Use this filter in front of a SingleSignOnFilter or CrossDomainSingleSignOnFilter, to manage idle timeout for client sessions in AM.
Proxy configuration can be created in the heap and used for AM notifications
A new ProxyOptions heaplet is available to define a proxy to which a ClientHandler or ReverseProxyHandler can submit requests, and an AmService can submit Websocket notifications.
A new global ProxyOption heap object is provided.
What’s New in IG 7.1.2
Support for cookies in standalone mode
sameSite
is a new subproperty of session
in admin.json
,
to manage the circumstances in which a cookie is sent to the server. Use this
property to reduce the risk of cross-site request forgery (CSRF) attacks when
IG is in standalone mode.
New EL functions for better pattern matching
The functions find
and matchesWithRegex
are added to use as
replacements for the deprecated function matches
.
The function findGroups
is added to use as a
replacement for the deprecated function matchingGroups
.
For more information, refer to Functions.
Improved logging
Exception logging when looking for client certificates in ChfApplicationWebHandler has been improved.
When IG detects that AMCtxId
is not available in a session, it now
checks that notifications are enabled before logging an error. When
notifications are disabled, there is no need to make AMCtxId
available.
What’s New in IG 7.1.1
Vert.x metrics
Vert.x metrics are now available by default for IG in standalone mode, to provide metrics for HTTP, TCP, and the internal component pool. The metrics provide low-level information about requests and responses, such as the number of bytes, duration, the number of concurrent requests, and so on.
Metrics are provided at the Prometheus Scrape Endpoint and Common REST Monitoring Endpoint endpoints.
For more information, refer to the vertx
object in admin.json
, and Monitoring VertX metrics.
Additional Logging for a BadRequestException During Policy Evaluation Requests
To help with troubleshooting, a debug message is logged when a BadRequestException occurs during policy evaluation requests. In previous releases, the original error was not logged, IG just returned an HTTP 401 Unauthorized.
What’s New in IG 7.1
Non-blocking processing and data streaming
Bi-directional asynchronous streaming of the HTTP entity (HTTP/1.1 and HTTP/2)
streamingEnabled
is a new property in admin.json
for standalone mode to
stream the content of HTTP requests and responses. When this property is
true
, the evaluation of runtime expressions that consume streamed
content must be deferred.
This feature introduces changes that can impact your migration from a previous version of IG. For more information, refer to Incompatible changes.
For more information, refer to AdminHttpApplication and runtime expression.
Deferred evaluation of runtime expressions
The evaluation of runtime expressions can be deferred until all of the content of the request or response is available. To prevent blocked threads, use deferred evaluation for runtime expressions that consume streamed content.
For more information, refer to runtime expression.
API security
Retention of URI fragments during authentication
FragmentFilter is a new filter that enables URI fragments to be retained during authentication with the SingleSignOnFilter, CrossDomainSingleSignOnFilter, OAuth2ClientFilter, and PolicyEnforcementFilter. Previously, when an unauthenticated requested a resource that contained a URI fragment, the fragment was lost in the eventual redirect.
For more information, refer to FragmentFilter.
Customized claim checks in IdTokenValidationFilter
Some OAuth 2.0 providers allow roles, groups, and custom properties to be
defined in a JWT. The customizer
property, previously available in the
JwtValidationFilter, has been added to the IdTokenValidationFilter. Use this
property to validate customized properties for a JWT, while still validating
the existing constraints in the IdTokenValidationFilter.
For more information, refer to IdTokenValidationFilter.
JwtValidationFilter applies constraints for claim comparison and pattern match
In JwtValidationFilter, the set of validation constraints for JWT claims and sub-claims now includes the following additional constraints:
-
Claims comparisons, to check that a claim value compares to another value or the value of another claim as follows:
isGreaterOrEqualTo
,isGreaterThan
,isLessOrEqualTo
, orisLessThan
. -
Regex match, to check that the claim value matches a specified regular expression.
For more information, refer to the customizer
property in JwtValidationFilter.
Secrets
Support for PEM-encoded secrets
PemPropertyFormat is a new format for secrets used in mappings in FileSystemSecretStore and SystemAndEnvSecretStore. Use PemPropertyFormat to read a Privacy-Enhanced Mail (PEM) file.
For more information, refer to PemPropertyFormat.
Support for SAML 2.0 signing and encryption with secrets
IG can now use the Commons Secrets Service when acting as a SAML 2.0 service provider, when signing and/or encryption is enabled in the IDP or SP configuration in AM.
For more information, refer to SamlFederationHandler.
Expose cryptographic keys as a JWK set
JwkSetHandler is a new handler that exposes cryptographic keys as JWK set. Use this handler so that a downstream application can reuse the exposed keys for their assigned purpose.
For more information and an example of use, refer to JwkSetHandler.
Support for lease expiry in secret stores
leaseExpiry
is a new property for the following SecretStores, to define
the time that secrets can be cached before they must be refreshed:
-
SystemAndEnvSecretStore
-
FileSystemSecretStore
-
KeystoreSecretStore
-
HsmSecretStore
-
JwkSetSecretStore
For more information, refer to Secrets object and secret stores.
Key ID header available for JwtBuilderFilter and JwtSession
The key ID header, kid
, used to match a specific key, is now present in JWTs
built by JwtBuilderFilter and JwtSession.
For information about kid
, refer to
"kid" (Key ID) Parameter.
Stability
Limit on connection attempts prevents stalled requests and timeouts
initialConnectionAttempts
is a new property in AmService to limit the number
of times IG attempts to open a WebSocket connection before failing
to deploy the route. Use this feature to prevent stalled requests and timeouts.
For more information, refer to AmService.
Monitoring
TimerDecorator available for AccessTokenResolvers.
The TimerDecorator can now record the time to process requests and responses as they pass through AccessTokenResolvers.
For more information, refer to TimerDecorator.
Log for tested and successful route conditions.
A new logger is available to log the routes for which IG evaluates a condition, and the route that matches a condition and treats a request.
For more information, refer to the condition
property of Route.
Other
SAML 2.0 requests processed with original URI value
useOriginalUri
is a new property in SamlFederationHandler to prevent errors
that occur when a baseUri
decorator applies to the whole route. This change
forces the handler to use the original URI instead of the rebased URI when
validating RelayState and Assertion Consumer Location URLs.
For more information, refer to SamlFederationHandler.
New methods to get and set URL-encoded form data in scripts
Entity.getForm() and Entity.setForm(Form) are new methods available for use
in scripts, with the content type application/x-www-form-urlencoded
.
Limit on size to which a JWT can be decompressed
org.forgerock.json.jose.jwe.compression.max.decompressed.size.bytes
is a new
system property to limit the maximum size to which a compressed JWT can be
decompressed. This property reduces the risk of a decompressed JWT consuming too
much available memory.
For more information, refer to Provided Properties.
Temporary storage directory
By default, the TemporaryStorage object now stores temporary files in
$HOME/.openig/tmp
instead of a directory defined by the system property
java.io.tmpdir
.
For more information, refer to TemporaryStorage.
Redirection marker can be disabled or renamed
redirectionMarker
is a new property in SingleSignOnFilter to limit the number
of authentication redirects.
When there is no SSO session due to, for example, SSO cookie name misconfiguration, an authentication request fails and is redirected back to IG. The scenario can result in infinite authentication redirects.
For more information, refer to SingleSignOnFilter.
Log entry for number of retries
When a runtime error occurs during the execution of a request to a remote server, IG retries the request until the allowed number of retries is reached or the execution succeeds. The retries are now logged by default.
For more information, refer to the retries
property of ClientHandler.
System property to decode invalid characters without error
org.forgerock.http.util.ignoreFormParamDecodingError
is a new Java system
property to ignore form encoding errors caused by invalid characters. Encoded
values are used instead.
For more information, refer to Supported system properties.
What’s new in IG 7.0.2
Filter to rebase the scheme, host name, and port of requests
The ForwardedRequestFilter has been added to rebase a request URI with a computed scheme, host name, and port. Use this filter to configure redirects when the request is forwarded by an upstream application such as a TLS offloader.
What’s new in IG 7.0.1
AmService automatically obtains SSO token header name from AM
To reduce configuration errors, and simplify configuration, AmService no longer
uses the default value, iPlanetDirectoryPro
, for ssoTokenHeader
. If
ssoTokenHeader
is not provided, IG queries the AM
/serverinfo/*
endpoint for the header name or cookie name of the SSO token.
What’s new in IG 7.0.0
IG as a standalone Java executable
IG is now delivered as a .zip file, for installation in
standalone mode. In standalone mode, IG provides a simple unzip installation
path, a classes
directory for support, a startup script, and support for custom
extensions.
A Vert.x-specific configuration block is available in the connector
property
of admin.json
, and in the websocket
property of ClientHandler and
ReverseProxyHandler.
Support for HTTP/2 when IG is client-side
In standalone mode, IG can use HTTP/2 or HTTP/1.1 to send requests to a proxied application, or request services from a third-party application.
No additional configuration is required to use HTTP/2 over non-TLS. The Application Layer Protocol Negotiation ALPN extension is used for HTTP/2 over TLS.
The protocol is negotiated according to the configuration of IG’s
admin.json
, the alpn
property in ClientTlsOptions, and by the new properties
protocolVersion
and http2PriorKnowledge
in the ClientHandler and
ReverseProxyHandler.
Support for HTTP/2 when IG is server-side
IG in standalone mode provides a new object, ServerTlsOptions,
to configure server-side properties of the the TLS-protected connector.
Use ServerTlsOptions in admin.json
.
Support for patching
For IG installed in standalone mode, classes is a new directory in the classpath for patches from support.
Docker
Evaluation Docker image
An unsupported base Docker image is provided for IG, available in a public Docker registry.
IG .zip provides Dockerfile
The IG .zip file now provides a Dockerfile that you can use to build a Docker image.
Api security - separating API security concerns from business concerns
Policies with new options for more flexibility
-
sessionIdleRefresh
is a new property of AmService, to periodically refresh AM sessions.When the SingleSignOnFilter is used for authentication with AM, AM can view the session as idle even though the user is interacting with IG. The user session eventually times out and the user must re-authenticate.
Authenticate through AM authentication trees and chains
A new property, authenticationService
, in SingleSignOnFilter and
CrossDomainSingleSignOnFilter lets users authenticate to AM by using
AM’s authentication trees and chains.
Adding basic authentication to outgoing requests
HttpBasicAuthenticationClientFilter
is a new filter for service-to-service
contexts, where IG needs to access remote resources that are
protected by HTTP Basic Authentication.
CORS to enable APIs, and control cross-origin access
CorsFilter
is a new filter to configure policies to allow user agents to
make requests across domains.
Declarative authorization, for local evaluation of authorization rules
AllowOnlyFilter
is
a new filter to authorize only requests that satisfy a set of rules
based on the provenance, destination, and
additional conditions of the request. When the rules are not satisfied,
the request is rejected.
Financial API grade security
FapiInteractionIdFilter
is a new filter to track the interaction ID of requests,
according to the Financial-grade API (FAPI) WG.
DateHeaderFilter
is a new filter to insert the server date in an HTTP date
header on the response.
SetCookieUpdateFilter to update cookie attributes
SetCookieUpdateFilter
is a new
filter to update cookie attributes. Use SetCookieUpdateFilter for legacy
applications, where cookies do not conform to requirements for newer browsers.
Temporary storage files in custom directory
By default, IG writes temporary files to $HOME/.openig/tmp
.
You can now change the directory by setting the temporaryDirectory
property in
admin.json
.
Skew allowance in StatelessAccessTokenResolver
The property skewAllowance
has been added to the
StatelessAccessTokenResolver to manage the validity period of access_tokens.
OAuth 2.0, to separate API security concerns from business concerns
Caching OAuth 2.0 access tokens
CacheAccessTokenResolver
is a new object to enable and configure caching of
OAuth 2.0 access_tokens, based on Caffeine.
mTLS through HTTP headers for certificate-bound access tokens
IG 7 adds support for draft 12 of the OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens specification, a key component of our Open Banking and Revised Payment Services Directive (PSD2) support.
CertificateThumbprintFilter
is a new filter to verify of certificate-bound
access_tokens. ConfirmationKeyVerifierAccessTokenResolver
is a new access token
resolver to verify that certificate-bound OAuth 2.0 bearer tokens presented by
clients use the same mTLS-authenticated HTTP connection.
Use these objects when IG is running behind a TLS termination point, such as a load balancer or other ingress point.
OAuth 2.0 client credentials filter
ClientCredentialsOAuth2ClientFilter
is
a new filter to authenticate a client, using the client’s
OAuth 2.0 credentials. Use this filter in a service-to-service context,
where a service needs to access resources protected by OAuth 2.0.
The filter obtains an access_token from an authorization server, and injects the access_token into the inbound request as a Bearer Authorization header, and refreshes the access_token as required. For more information, refer to ClientCredentialsOAuth2ClientFilter.
Discovery and dynamic registration using private_key_jwt
The private_key_jwt
authentication method can now be used
for authentication during discovery and dynamic registration with an OpenID
Connect provider. In previous releases, only
client_secret_basic
and
client_secret_post
authentication methods could be used.
Secrets
SecretsProvider provides improved control over where to search for secrets
SecretsProvider
is an updated heap object to specify a secrets service to
resolve secrets for IG configuration objects, using the property
secretsProvider
.
For backward compatibility, if SecretsProvider is not configured, objects use the global secrets service, which searches for keys across the whole configuration. If multiple keys have the same label, there is a bigger risk that the wrong key is used.
New secret stores
JwkSetSecretStore
is a new secret store for JSON Web Keys (JWK) in a JWK Set.
Base64EncodedSecretStore
is a new secrets store for generic secrets, such as
passwords or simple shared secrets, whose base64-encoded values are hard-coded
in the route. Use this store for testing or evaluation only. In production, use
an alternative secret store.
Secret formats
SecretsKeyPropertyFormat
is to define the format and algorithm used for the
secrets.
Use this object with FileSystemSecretStore or SystemAndEnvSecretStore, when symmetric keys are provided in files, environment variables, or system properties, by external secret management systems, such as Kubernetes Secrets or Docker Secrets. In previous releases, symmetric keys had to be declared in a KeystoreSecretStore.
KeyManager and TrustManager provided as secrets
SecretsKeyManager
is available for IG in standalone mode to provide
secrets for KeyManager. Use with ClientTlsOptions and ServerTlsOptions to prove
the identity of the local peer during TLS handshake.
SecretsTrustManager
is available for IG in standalone mode to provide
secrets for TrustManager. Use with ClientTlsOptions and ServerTlsOptions to
manage trust material for peer credentials.
Secrets in FileSystemSecretStore or SystemAndEnvSecretStore for signing and encryption
Secrets stored in a FileSystemSecretStore or SystemAndEnvSecretStore can now be used for symmetric signing keys and symmetric encryption keys. In previous releases, keys had to be declared in a KeystoreSecretStore.
For more information, see the mappings
property of FileSystemSecretStore and
JwtBuilderFilter.
Secrets in CDSSO
IG can now verify the signature of signed CDSSO tokens in cross-domain single sign-on.
For more information, refer to the properties verificationSecretId
and secretsProvider
in CrossDomainSingleSignOnFilter.
Deterministic ECDSA for JWT signatures
When elliptic curve keys are used for signing, and Bouncy Castle is installed, and, by default, JWTs are signed with a deterministic ECDSA. In previous releases, JWTs were signed with a non-deterministic ECDSA, which is less secure.
The new system property
org.forgerock.secrets.preferDeterministicEcdsa
is by
default true
. To use the less secure algorithm, set
the property to false
.
HTTP sessions
Authenticated encryption for stateless sessions
JWT tokens can now be secured by authenticated encryption with symmetric keys.
There is now no need to sign these JWTs as a separate step, leaving
more space for session data.
Before this release, JWT tokens could only be encrypted
and then
signed.
SetCookieUpdateFilter
SetCookieUpdateFilter
is
a new filter to change the attributes of generated cookies.
Stability
Session attributes retrieved without AM session properties whitelist
IG can now retrieve specified session properties or all session properties from AM, without relying on AM’s Session Properties Whitelist. Properties with a value are returned; properties with a null value are not returned.
In previous releases, only whitelisted session properties were returned, irrespective of whether they had a value.
For more information, refer to sessionProperties
in AmService.
Skew allowance in JwtSession
A new property skewAllowance
has been added to
JwtSession to manage small differences in system clocks.
Improved protection from MIME sniffing
To help prevent MIME sniffing of responses from the StaticResponseHandler,
the X-Content-Type-Options
response header is now
set by default to nosniff
.
In previous releases, the header was not set, allowing the user agent
to interpret the response entity as a different content type.
Ping endpoint
A ping endpoint is available after IG startup to check whether
IG is available. When IG is installed and running as
described in the Getting Started, the endpoint is at http://ig.example.com:8080/openig/ping
.
Cloud readiness
Global log level configurable through a variable
To make it easier to deploy IG without modifying the default
configuration, the global log level is now defined as a variable in the
default logback.xml
. To change the global log level,
set an environment variable or system property.
Studio
Freeform Designer
Freeform Designer has moved from Technology Preview to Stable, as defined in Product stability labels.
The Studio Welcome page has been replaced by the Routes page.
Global decoration of routes in Studio
The globalDecorators
property can now be configured for a route in Studio.
Logs and audits
Allowlisting for audit event fields in logs
To prevent logging of sensitive data for an event, the Common Audit Framework uses an allowlist to specify which event fields appear in logs. By default, only event fields in the list are included in the logs.
Audit of custom events
IG can now record custom audit events as well as
access
audit events.
AuditClientHandler for Splunk
You can now configure a client handler named
AuditClientHandler
in the heap, to relay audit events
to Splunk.
If a client handler named ElasticsearchClientHandler
or
SplunkClientHandler
is configured in the heap, it
is used by priority.
NoOpAuditService provided by default
NoOpAuditService
is
a new audit service to add an empty audit service to the top-level heap
and its child routes. When an AuditService is not defined, auditing is
delegated to the parent audit service.
For more information, refer to NoOpAuditService.
Core
URI path rewriting
UriPathRewriteFilter
is
a new filter to rewrite the path of a request URL. Use this filter to expose
applications that are on a different path. Continue to use baseURI
to override
the scheme, host, and port of a request URL. UriPathRewriteFilter does not
re-write the content of a message.
ResourceHandler serves static content
ResourceHandler
is
a new handler to serve static content from a directory. In previous
releases, IG could not serve static content so easily.
For more information, refer to ResourceHandler.
IG agent in AM
AM now provides a simplified process to create an agent profile for IG. When the IG agent is authenticated, the token can be used for tasks such as getting the user’s profile, making policy evaluations, and connecting to the AM notification endpoint.
Procedures in the Gateway Guide that previously used a Java agent in AM now use the new profile for an IG agent in AM.
Others
JDBC data source configured outside container
JDBC data sources can now be set up independently of the web container configuration. In previous releases, JDBC data sources were configured at the web container level. For more information, refer to JdbcDataSource.
CrossDomainSingleSignOnFilter logout triggered by any aspect of request
New CrossDomainSingleSignOnFilter properties, logoutExpression
and defaultLogoutLandingPage
, are available to trigger logout of the associated
AM session token based on any aspect of a request.
CaptureDecorator for mask header and attribute values
The CaptureDecorator can now be configured to mask the value of headers and attributes in the logs. Use this feature to prevent disclosure of sensitive information in the logs.
Eviction of revoked OAuth 2.0 access tokens
(From AM 6.5.3.)
The CacheAccessTokenResolver and
OAuth2ResourceServerFilter can now receive a notification when AM revokes
an OAuth 2.0 access_token, and can evict the token from the cache.
For more information, refer to CacheAccessTokenResolver,
and the cache
property of OAuth2ResourceServerFilter.
ipMatch function
The function ipMatch()
is added to check whether an IP address matches an IP
range.
Class imported automatically for Groovy scripts
The org.forgerock.http.header
class is now imported automatically for Groovy
scripts.
Enhanced command-line for sample application
When you launch the sample application, new command-line options are available to configure the ports, session timeout, AM URL base for the OpenID provider configuration, and help display.
New functions for URL-safe and filename-safe encoding and decoding
The functions encodeBase64url
and decodeBase64url
are added to facilitate
URL-safe and filename-safe encoding and decoding.
For more information, refer to the functions encodeBase64url
and decodeBase64url
.
ConnectionFactory heartbeat can be disabled
The heartbeat of the ConnectionFactory used in the
org.forgerock.openig.ldap.LdapClient
, enabled by default, can now be disabled.
In previous releases, it could not be disabled.
Join function can process an iterable string
The join
function can now return a string joined with the given separator,
from an Iterable value. In previous releases, it used only an array of string
values.
What’s new in IG 6.5.4
Protection against cross-site request forgery
CsrfFilter
is a new filter to harden protection against CSRF
attacks.
What’s new in IG 6.5.3
SAML support for all name ID formats
In SAML SP-initiated SSO, IG can now act as an SP with an IDP
that does not support the transient
NameID Format.
For SP-initiated SSO as well as for IDP-initiated SSO, the NameID Format
can be any format supported by the IDP.
In previous releases, for SP-initiated SSO, the NameID Format could be only
urn:oasis:names:tc:SAML:2.0:nameid-format:transient
.
Spaces maintained in cookie values
As a cookie passes through IG, if the cookie value is not enclosed in quotes, spaces in the cookie value are not removed. In previous releases, spaces were removed.
Option to reuse connections after a request
Not supported for IG in standalone mode.
stateTrackingEnabled
is a new property of ClientHandler and ReverseProxyHandler
to specify whether a connection can be kept open and reused after a request.
Sample application user passwords updated
The user passwords in the sample application files are updated to align with the new AM password policy.
What’s new in IG 6.5.2
Multiple OIDC providers use same clientID
In OpenID Connect with multiple client registrations, the same clientId
can
now be used for multiple client registrations if the issuerName
for each
registration is different.
The clientId
must be unique in the context of a single issuer.
In the OAuth2ClientFilter login service URI, specify both the
clientId
and the issuerName
,
Request policy decisions from AM using a configurable resource URL
resourceUriProvider
is a new property of the PolicyEnforcementFilter to ease
the transition from an agent-based system. Use the property to request AM
policy decisions with the original request URL as the resource URL, or with a
script to generate the resource URL.
In previous releases, IG could request policy decisions only
by using the route baseURI
as the resource URL.
Infinite loop prevention in single sign-on
The SingleSignOnFilter has been adapted to prevent an infinite loop when a final
redirect is returned without AM session cookie name. The filter now
checks the goto query parameter for the presence of the _ig
marker parameter.
SingleSignOnFilter logout can be triggered by any aspect of a request
The new SingleSignOnFilter property logoutExpression
can trigger logout based on any aspect of a request.
Before this improvement, logout could be triggered only when a request
matched the URI path.
secure
and httpOnly
options to the JwtCookieSession cookie config.
secure
and httpOnly
options on the cookie created for JWT sessions.
Warning if decoded secret starts or ends in a non-ASCII character
IG logs a warning when the decoded value of a BASE64-encoded secret starts or ends with a non-ASCII character.
If a text editor adds a carriage return to the end of a plain string value before it is encoded, non-ASCII characters can be added to the BASE64-encoded value. When the decoded value is used as part of a username/password exchange, it can then cause an authentication error.
Support for SameSite Cookies
sameSite
is a new property in
CrossDomainSingleSignOnFilter and JwtSession to manage the
circumstances in which a cookie is sent to the server.
Use this property to manage the risk of cross-site request forgery (CSRF)
attacks.
Support for applications using a payload in GET or HEAD requests
The payload body of a GET or HEAD request is now honored. In previous releases, the payload body was removed when the internal Request representation was created. TRACE is the only request that does not support a payload.
Correct maintenance of cookies with sameSite
flag
Cookies that arrive at IG with the sameSite
flag set are correctly
maintained.
Resource exception not logged at error level when AM returns 401
Previously, if the user’s SSO session had expired or become otherwise invalid and was used in a request to IG, calling the AM session info endpoint to get session status would return a 401 response. This 401 response was valid but ended up being logged by IG at Error level, which was misleading, and would generate a large amount of additional logging data.
IG now logs an error message only when the response from an AM session info endpoint is not a 401. IG still logs it as a debug message to show that it was a 401 response.
What’s new in IG 6.5.1
OAuth 2.0 mutual TLS
IG now supports that ability for clients to authenticate AM through OAuth 2.0 mutual TLS (mTLS) and X.509 certificates. You must use self-signed certificates or public key infrastructure (PKI), as per version 12 of the draft OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens.
StatelessAccessTokenResolver can now rely on a SecretsProvider
SecretsProvider is now available to provide a secrets service for the StatelessAccessTokenResolver. It uses specified secret stores to resolve access tokens.
Before this improvement, the StatelessAccessTokenResolver used the global secrets service to resolve access tokens, which searches for keys across the whole configuration. If multiple keys have the same label, there is a bigger risk that the wrong key is used.
For backward compatibility, if SecretsProvider is not configured, the StatelessAccessTokenResolver uses the global secrets service.
Policy enforcement advice
If an AM policy decision denies a request with supported advices, the PolicyEnforcementFilter can now redirect the request to a URL specified in a SingleSignOnFilter, such as the URL of the custom login page. Previously, the filter always redirected the request back to AM.
The URL is passed in a new property, loginEndpoint
,
in the ssoToken
context. To use the redirect,
configure loginEndpoint
in the SingleSignOnFilter.
New toJSON
function to parse strings as JSON
A toJSON
function is now available in expressions to parse strings as JSON.
Preserve query strings in URLs
preserveOriginalQueryString
in AdminHttpApplication is now available to
preserve query strings as they are presented in URLs. Select this option when
query strings must not change during processing, for example, in signature
verification.
By default, IG tolerates characters that are disallowed in query string URL components, by applying a decode/encode process to the whole query string.
What’s new in IG 6.5
Commons secret service
IG leverages the Commons Secrets Service for the management of passwords and secrets in the following objects: AmService, ClientHandler, ClientRegistration, JwtSession, KeyManager, JwtBuilderFilter, and CapturedUserPasswordFilter.
Managing secrets with the Commons Secrets Service provides the following benefits:
-
Separation from other configuration so that configuration can be moved between environments
-
Storage in different secure backends, including file-based keystores, Hardware Security Modules (HSM), and Key Management Systems (KMS)
-
Provision through environment variables or unencrypted JSON, for deployment simplicity or where host/OS security is considered adequate.
-
Ease of rotation or revocation, regardless of the storage backend.
In this release, routes generated in Studio do not use the Commons Secrets Service. Documentation examples generated with Studio use deprecated properties.
Local validation of stateless access-tokens
The StatelessAccessTokenResolver is now available to validate stateless access tokens without referring to AM. Use StatelessAccessTokenResolver with the access token resolver in OAuth2ResourceServerFilter.
Because IG can validate stateless access tokens locally, without referring AM, this feature provides the following benefits:
-
Improved performance, by reducing the number of network hops required for validation
-
Improved robustness, by validating access tokens even when AM is not available
Supported with OpenAM 13.5, and AM 5 and later versions.
Transactional authorization
IG can now respond to the TransactionConditionAdvice from AM to require users to perform additional actions when trying to access a resource protected by an AM policy.
Performing the additional actions successfully grants a one-time access to the protected resource. Additional attempts to access the resource require the user to perform the additional actions again.
Disconnection strategy WebSocket notification service
IG can now configure what happens to the session cache and policy enforcement cache when the WebSocket notification service is disconnected and then reconnected. By default, the caches are cleared on disconnect.
Dynamic scope evaluation for OAuth2ResourceServerFilter
The OAuth2ResourceServerFilter can now use a script to evaluate which scopes must be provided in an OAuth 2.0 access token to access a protected resource. The script evaluates each request dynamically and returns the scopes that are required for the request to access the protected resource.
Use this feature when protected resources can’t be grouped within a set of static scopes, for example, when one set of URLs require one scope, and another set of URLs require another scope.
JWT encryption with JwtBuilderFilter
A new property, encryption, has been added to the JwtBuilderFilter to configure JWT encryption.
JwtBuilderFilter template declared as expression
The template property of JwtBuilderFilter can now be configured as an expression that evaluates to a map. The referenced map is serialized as a JSON object.
Connection to TLS-Protected endpoints with TlsOptions
A new object, TlsOptions, is available to configure connections to TLS-protected endpoints for the ClientHandler, ReverseProxyHandler, and for WebSocket notifications in AmService.
Increased flexibility for retrieving and caching user profiles from AM
The UserProfileFilter provides new features to retrieve and cache user profile information:
-
User authentication from OAuth 2.0 access tokens with UserProfileFilter
The UserProfileFilter can now retrieve AM profile attributes for users identified by their username, and can be used in routes that rely on OAuth2ResourceServerFilter and the
/oauth2/introspect
endpoint to resolve access tokens.The filter can use the SsoTokenContext, SessionInfoContext, or OAuth2Context to retrieve profile attributes.
-
Cache for user profile attributes with UserProfileFilter
The UserProfileFilter can now cache user profile attributes and reuse them without repeatedly querying AM.
In previous releases, the UserProfileFilter had to query AM for each request to retrieve the required user profile attributes.
Simplified configuration of objects by using AmService
A new property, agent
, in AmService defines a Java agent to act on behalf of
IG, and simplify configuration of the following filters:
-
SingleSignOnFilter, where agent defines the AM service to use for authentication. Users can authenticate in the same realm as the agent, or in a different realm.
-
PolicyEnforcementFilter, where agent defines the AM agent with the right to request policy decisions from AM. The policy set can be located in the same realm as the agent, or in a different realm.
-
TokenTransformationFilter, where agent defines the AM agent with the right to authenticate IG as an AM REST STS client.
The agent property is now mandatory in AmService and replaces properties in the above filters.
Configuration of WebSocket notifications by using AmService
A new property, notifications
, in AmService to disables WebSocket
notifications, configures the time between attempts to re-establish lost
WebSocket connections, and configures WebSocket connections to TLS-protected
endpoints.
UserProfileFilter configuration moved to AmService
To simplify configuration, properties in UserProfileFilter have been deprecated and replaced with properties in AmService.
StudioProtectionFilter to restrict access to studio in development mode
A new filter, StudioProtectionFilter, is available to protect the Studio endpoint when IG is running in development mode.
When IG is running in development mode, by default the Studio
endpoint is open and accessible. When StudioProtectionFilter is defined in
admin.json
, IG uses it to filter access to the Studio endpoint.
New features in Studio
New features have been added to the technology preview of Studio to allow you to:
-
Configure a SplunkAuditEventHandler
-
Upgrade HTTP connections to WebSocket protocol
-
Enable a session cache
-
Evaluate scopes dynamically for OAuth 2.0 authorization
New features in Freeform Studio
New features have been added to the technology preview of Freeform Studio to allow you to:
-
Create new routes that contain a SingleSignOnFilter, a PolicyEnforcementFilter, and an example AmService. Select the objects to configure them.
-
Drag and drop a SingleSignOnFilter, a PolicyEnforcementFilter, or any filter type onto the canvas. Select the filter to configure it. For other filter types, select the type, name the filter, and add the JSON configuration.
-
Define multiple AmService objects that you can choose from for filters.
-
Drag and drop a DispatchHandler onto the canvas, select its input node to connect it to the start element or another object, and select its output node to connect to one or more handlers. Select the connections to define the conditions for the dispatch.
-
Drag any filter into or out of a chain, and drag any filter or handler around the canvas. Select it to delete it.
-
Ctrl-click to select multiple objects, and maneuver or delete them at the same time.
-
View unconnected filters or handlers on the canvas as part of the JSON heap.
-
View the object name on the canvas.
Routes created in previous version of Freeform Studio are automatically transitioned into JSON editor routes.
TimerDecorator publishes metrics to the metric registry
When a TimerDecorator is set to true
in a route, the metrics are now written
to the Prometheus Scrape Endpoint and the Common REST Monitoring Endpoint.
Audit logging to standard output
Support has been added for an audit handler to send access log messages to standard output.
Default configurations for objects in AdminHttpApplication
AdminHttpApplication now declares default configurations for the following objects: ClientHandler, ReverseProxyHandler, ForgeRockClientHandler, ScheduledThreadPoolExecutor, and TransactionIdOutboundFilter.
WebSocket traffic for TLS connections
IG can now detect requests to upgrade from HTTPS to the WebSocket protocol, and create a secure, dedicated tunnel to send and receive WebSocket traffic.
What’s new in IG 6.1
Proxy WebSocket traffic
IG can now detect requests to upgrade from HTTP to the WebSocket protocol, and create a dedicated tunnel to send and receive WebSocket traffic.
When you create a route in Studio, you can enable a new option to upgrade HTTP connections to WebSocket protocol.
To help with development, the sample app has been updated to include a WebSocket endpoint that exposes a simple WebSocket server.
IG cannot proxy WebSocket traffic for TLS connections, or when it is running in the Jetty application container. |
JwtBuilderFilter to pass identity or other runtime info downstream
A new filter, JwtBuilderFilter, collects data at runtime, packs it in a JSON Web Token (JWT), and places the resulting JWT into the JwtBuilderContext. When the JwtBuilderFilter is used with a HeaderFilter, it provides a flexible way for IG to pass identity or other runtime information to the protected application.
To help with development, the sample app has been updated to include a /jwt
endpoint that displays the JWT and verifies its signature.
The JWT created by JwtBuilderFilter can be signed but is not encrypted. Carefully consider the security of your configuration when using this filter. |
New features in Freeform Studio
New features have been added to the technology preview of Freeform Studio to allow you to:
-
Drag-and-drop filters and handlers onto the canvas.
-
Add, reorder, or remove filters in a chain.
-
Connect a start node to a chain or handler, and connect chains to handlers.
-
Double-click on any node to edit it or rename it.
-
Easily edit SingleSignOnFilters in a dedicated page that hides the JSON representation.
-
Get feedback on structural errors in your route before you deploy it, by simply displaying the route configuration.
-
Routes created in Freeform Studio in IG 6.0 are automatically transitioned into JSON editor routes.
Disable capture
Instead of removing the decorator from the configuration, you can now configure
the capture point none
to disable capture.
Client connection pool timeToLive
is configurable
You can now expire pooled connections after a fixed duration by setting a
new property connectionTimeToLive
in the ClientHandler and ReverseProxyHandler.
To prevent the reuse of connections, set this property in routes for
applications where the IP address (baseURI) is not stable or can change.
What’s new in IG 6
ReverseProxyHandler to stream responses from a proxied application to the user agent
When IG fails to connect to a proxied application, the ReverseProxyHandler changes the runtime exception into a 502 Bad Gateway response.
When streaming is enabled, responses are processed as soon as all headers are received. The entity content is downloaded in a background thread. This mode reduces latency, and is mandatory for Server-Sent Events
UserProfileFilter to retrieve profile attributes of an AM user
A new filter, UserProfileFilter, queries AM to retrieve the profile attributes of an AM user. It makes the data available as a new context to downstream IG filters and handlers.
New SessionInfoFilter collects information about the AM session and makes it available to downstream handlers
A new filter, SessionInfoFilter, calls the AM endpoint for session information, and makes the data available as a new context to downstream IG filters and handlers. Session properties that are allowlisted in AM are available.
Support for Cross-Domain Single Sign-On
CrossDomainSingleSignOnFilter, CdSsoContext, and CdSsoFailureContext have been added. Users can authenticate to AM in one domain, and then access resources protected by IG in another domain, without having to re-authenticate.
Updated monitoring
The Prometheus Scrape Endpoint and Common REST Monitoring Endpoint have been added for monitoring.
The endpoints are available in IG, without any configuration. Metrics are available for each router, subrouter, and route in the configuration, and for the defaultHandler of the main router.
By default, everyone has read access to the Prometheus endpoint. No special credentials or privileges are required, but access can be restricted.
AmService heap object to hold configuration information about AM
The AmService heap object can be declared in the IG configuration to hold information about an instance of AM. IG objects that communicate with AM can share AmService, reducing the number of configuration properties in their configuration.
Agentless AM password capture and replay
The new CapturedUserPasswordFilter makes it possible to use AM’s password capture and replay feature without an AM policy agent.
This filter retrieves an AM password, decrypts it, and exposes it in a new context. By using CapturedUserPasswordFilter, you can get login credentials from AM without setting up an AM policy agent.
From AM 6, CapturedUserPasswordFilter can use the stronger algorithm AES to decrypt the AM password.
Introduction of session token cache
AmService provides a shared session service that can cache session token info for improved performance.
IG can now receive notifications from AM on session logout, or when an AM session is modified, closed, destroyed, or times out. IG evicts related entries from the session cache.
SingleSignOnFilter, CrossDomainSingleSignOnFilter, SessionInfoFilter, UserProfileFilter and PolicyEnforcementFilter are using that shared service.
In previous releases, the SingleSignOnFilter called AM to validate the SSO token for every request in a session. The SingleSignOnFilter can now process multiple requests in the same session without calling AM to validate the SSO token.
Eviction from the PolicyEnforcementFilter cache
IG can now capture WebSocket notifications from AM when a policy is created, deleted, or updated, and then clear the PolicyEnforcementFilter cache. To facilitate this feature, the PolicyEnforcementFilter cache has been replaced by a cache based on Caffeine.
More configuration options for caching for OAuth 2.0 access tokens
More options are provided for caching access tokens in OAuth2ResourceServerFilter.
Faster response processing and processing for response sizes over 2 GB
From this release, when streaming is enabled on the ClientHandler or ReverseProxyHandler, IG begins streaming a response to a client as soon as it begins receiving it from the downstream application.
Because IG does not need to buffer the entire content of the response, it can process responses faster, and can proxy applications and APIs that send responses bigger than 2 GB.
If the response flow includes a filter that buffers the entire content of the response, such as capture decorator, processing takes longer and the maximum size of the response is 2 GB.
AM realm containing UMA configuration can be specified
The AM realm that contains the UMA configuration can be specified in UmaService.
The endpoint for the UMA sharing service is now configured by the
wellKnownEndpoint
property of UmaService instead of authorizationServerUri
.
authorizationServerUri
has been removed.
Support for additional advice types in PolicyEnforcementFilter
The PolicyEnforcementFilter now supports the following AM advice types in
addition to AuthLevel
:
-
AuthenticateToService
-
AuthenticateToRealm
-
AuthScheme
IG can use system-defined proxy server
IG can now make use of a system-defined proxy server. Use the new
systemProxy
property of ClientHandler and ReverseProxyHandler to access the
feature.
Support for parameterized configuration
Support for parameterized configuration has been added through the introduction of configuration tokens, and the processes of token resolution, JSON evaluation, token substitution, and data transformation.
At startup and when routes are loaded, token resolvers make values available from environment variables, Java system properties, JSON and Java properties files, and route properties. Matching values are substituted in the configuration files as strings, and then transformed as required into different data types.
IG can proxy SSE API
IG can now proxy Server Sent Events (SSE) API.
Captured entity size is limited
The CaptureDecorator property maxEntityLength
has been added to limit the
number of bytes that can be captured for an entity. Before this release,
IG tried to capture the entire entity.
When the CaptureDecorator property captureEntity
is true
, use this property
to prevent excessive memory use or OutOfMemoryError
errors.
IG is automatically deployed on the root context in Jetty
To deploy IG in Jetty, it is no longer necessary to rename the
IG .war file from ig.war
to root.war
.
Class import for Groovy scripts
The following additional classes are now imported automatically for Groovy scripts:
-
org.forgerock.http.oauth2.AccessTokenInfo
-
org.forgerock.json.JsonValue
It is no longer necessary to include imports statements for these classes in Groovy scripts.
IG can retry HTTP requests
IG can now retry failed HTTP requests. You can specify the number of times IG retries a failed request, and the delay between retries.
In bootstrap scenarios where IG depends on third-party services, IG can now pause the startup process until the required services are online (for example, OpenID Connect well-know configuration endpoint).
Technology preview of Freeform Studio
Freeform Studio is a new user interface to develop complex routes of filters and handlers. As you design a route, Freeform Studio helps you to visualize the chain of filters and handlers, identify break points, and track the path of requests, responses, and contexts.
Configuration for TokenTransformationFilter
The TokenTransformationFilter can now be configured in Studio.
Use of Arguments in scripts
Scripts for use in the ScriptableFilter and ThrottlingFilter can now be configured with arguments in Studio.
Audit logging with JSON audit event handler and ElasticSearch audit event handler
Audit logging can now be configured in Studio for JSON audit event handler and ElasticSearch audit event handler.
Configuration for stateless sessions
Stateless sessions that do not use a keystore can now be configured in Studio.
Assisted Upgrade for Routes Deployed in Studio
During IG upgrade, routes that were previously created in Studio are automatically transferred to the new version of IG. If extra information is required for compatibility, you are prompted for the required information.
Capture message context in Studio
Studio can now be used to configure the capture of the message context as well as the message body.
What’s new in IG 5.5
Studio improvements
-
Throttling policies
Grouping policies that apply a throttling rate to a single group containing all requests, or to independent groups of requests. Groups can be defined with a standard or custom grouping policy.
Mapping policies that allow custom mapping criteria, and multiple mapped rates in mapped throttling policies.
-
Different filter types
The following filter types and scripts can now be created in Studio: generic filters, scripts, scriptable filters, and scriptable rate policies for throttling filters.
-
Route import
Routes can now be imported from external .json files into Studio. Routes not created in Studio can be viewed in the backend configuration.
-
Route editing
The Studio editor ca nbe used to edit routes that were created in Studio, imported from file, or that exist your backend configuration.
-
Route viewing
A route’s filters can now be viewed in a chain, and reordered in the chain.
You can view a route’s status to see if it is
Undeployed
,Deployed
,Changes pending
, orOut of sync
-
Capture
Studio can now capture Ping Identity Platform messages as well as messages about requests and responses that are traversing the route.
-
Search
Studio now includes a search feature to search for routes.
OAuth 2.0 Token Introspection
IG now supports the token introspection endpoint, /oauth2/introspect
to resolve OAuth 2.0 access tokens. In previous releases, only the token info
endpoint, /oauth2/tokeninfo
, was supported.
Use the /oauth2/introspect
endpoint to retrieve metadata about a token that is
not available at the /oauth2/tokeninfo
endpoint, such as the context in which
the token was issued.
Client authentication through private_key_jwt
Clients can now authenticate to an OAuth 2.0 authorization server or OpenID
provider using the tokenEndpointAuthMethod
method private_key_jwt
.
With private_key_jwt
, you can configure claims to be
used for client authentication during access token retrieval.
Scripting to configure OAuth 2.0 token resolution
It is now possible to configure access token resolution by using a script.
For information about all configuration options, see the accessTokenResolver
property of OAuth2ResourceServerFilter.
Support for IG JBoss EAP
IG can now run in JBoss Enterprise Application Platform (JBoss EAP) version 7.
Audit event handlers
Support has been added for the Splunk audit event handler.
Support for UMA 2.0
Support for UMA 2.0 has been added in this release. Features and functionality have been upgraded to support new UMA standards. Support for earlier versions of UMA has been removed.
Configuration expressions for header name and form parameter name of StaticRequestFilter
Configuration expressions can now be used to create the following properties of the StaticRequestFilter:
-
name
field of the propertyheaders
-
param
field of the propertyform
This feature provides the flexibility to assign different header names and form parameters when using the same route in different environments. For example, the name of a cookie header can be different in a production or development environment.
ClientHandler can declare an HTTP web proxy
The ClientHandler can now declare an outgoing proxy server such as Squid to submit requests to other parts of the network.
Runtime expressions for baseURI
of DispatchHandler
Runtime expressions can now be used to define the baseURI
property of
DispatchHandler.
This feature provides the flexibility to change the baseURI
according to some
request attributes.
Increased flexibility for authentication in SingleSignOnFilter
A new property, loginEndpoint
, is added to the
SingleSignOnFilter to increase flexibility for authentication.
Authentication can be performed through AM or an alternative
application, and can include authentication parameters.
For information, see the loginEndpoint
property of SingleSignOnFilter
Configuration expressions in prefix
and the reference configuration object
Configuration expressions can now be used in the definition of
prefix
and the reference configuration object.
Audit event fields case-insensitive for filtering
A list of audit event fields can be specified to be considered as case-insensitive for filtering.