Token exchange
FoxIDs ondersteunt twee verschillende scenario's voor token exchange: token exchange in dezelfde omgeving en token exchange via trust naar externe IdP/OP.
In dezelfde omgeving is het mogelijk om token exchange van access tokens te doen in een webapplicatie of API/resource naar een andere resource.
Via externe trust is het mogelijk om token exchange te doen van externe access tokens en SAML 2.0 tokens naar interne access tokens.
Samples
Token exchange is geïmplementeerd in de volgende samples:
- AspNetCoreOidcAuthCodeAllUpPartiesSample, toont token exchange van access token naar access token binnen een website backend
- AspNetCoreSamlSample, toont token exchange van SAML 2.0 token naar access token
- AspNetCoreApi1Sample, toont token exchange van access token naar access token binnen een API
U kunt token exchange testen met de online webapp sample (sample docs) door op
Log inte klikken en in te loggen met een optionele IdP. Klik vervolgens opCall API1 which call API2ofToken Exchange + Call Api2om een API aan te roepen met token exchange.
Bekijk de sample configuratie in FoxIDs Control: https://control.foxids.com/test-corp
Krijg read access met gebruikerreader@foxids.comen wachtwoordgEh#V6kSw
Applicatieregistratie configuratie
Het is mogelijk om te configureren of token exchange is toegestaan op de OAuth 2.0 applicatieregistratie of OpenID Connect client. Ook is het mogelijk om te configureren of client credentials grant moet zijn toegestaan.
Standaard zijn zowel client credentials grant als token exchange toegestaan op OAuth 2.0 applicatieregistraties en OpenID Connect clients.
Standaard wordt de client toegevoegd als token exchange actor, dit gedrag kan worden uitgeschakeld.

Token exchange in dezelfde omgeving
Het is mogelijk om een access token uitgegeven aan een resource te token exchangen en daarmee een access token voor een andere resource in de omgeving te verkrijgen.
Een applicatieregistratie client wordt geconfigureerd om de token exchange af te handelen en om te whitelisten voor welke resources in de omgeving het is toegestaan om token exchange te doen.
Access Token naar Access Token in webapplicatie
Een webapplicatie token exchangt een JWT access token naar een JWT access token in dezelfde omgeving.
In dit scenario heeft een OpenID Connect client een access token verkregen na gebruikersauthenticatie.
De client kan ook een OAuth 2.0 client zijn die client credentials grant gebruikt.
De omgeving bevat twee resources en de OpenID Connect client mag zowel de eerste als de tweede resource direct aanroepen. Om least privileges te bereiken krijgt de OpenID Connect client na gebruikersauthenticatie alleen een access token voor de eerste resource. En verkrijgt vervolgens een access token voor de tweede resource wanneer dit nodig is.

Het eerste access token wordt uitgegeven met een scope/audience voor de OpenID Connect client en de client mag daardoor access tokens exchangen naar een access token dat geldig is voor de tweede resource.
De OpenID Connect client is geconfigureerd met een secret als client credentials, gebruikt zowel in de OpenID Connect communicatie als bij token exchange.
Tijdens de token exchange sequentie worden claims transformations en limitations uitgevoerd op de OpenID Connect applicatieregistratie.
De OpenID Connect client doet een token exchange call naar FoxIDs, authenticert de client en stuurt het access token terwijl (met een scope) om een access token voor de tweede resource wordt gevraagd. Bij succes ontvangt de resource client een access token terug en kan nu de tweede resource aanroepen met het access token.
Voorbeeld token exchange POST request naar het token endpoint:
POST https://foxids.com/test-corp/-/aspnet_oidc_allup_online_sample(*)/oauth/token HTTP/1.1
Host: foxids.com
Content-Type: application/x-www-form-urlencoded
client_id=aspnet_oidc_allup_sample
&client_secret=IxIruKswG4sQxzOrKlXR58strgZtoyZPG18J3FhzEXI
&grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&scope=aspnetcore_api2_sample%3Asome_2_access
&subject_token=accVkjcJyb4...UC5PbRDqceLTC
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token
Voorbeeld token exchange JSON response:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store
{
"access_token":"eyJhGcjlc...nNjb3IIWvmDCM",
"issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
"token_type":"Bearer",
"expires_in":600
}
Voorbeeld JWT access token body:
{
"sub": "2f18c344-1204-4629-b992-215913b85c2b",
"auth_time": "1699955593",
"amr": "pwd",
"email": "test1@foxids.com",
"role": ["role1","role2"],
"name": "Test 1 user",
"act": "{\"sub\":\"c_aspnet_oidc_allup_sample\"}",
"scope": "aspnetcore_api2_sample:some_2_access",
"client_id": "aspnet_oidc_allup_sample",
"nbf": 1699955534,
"exp": 1699956194,
"iat": 1699955594,
"iss": "https://foxids.com/test-corp/-/",
"aud": "aspnetcore_api2_sample"
}
Access Token naar Access Token in API
Een API token exchangt een JWT access token naar een JWT access token in dezelfde omgeving.
In dit scenario heeft een OpenID Connect client een access token verkregen na gebruikersauthenticatie.
De client kan ook een OAuth 2.0 client zijn die client credentials grant gebruikt.
De omgeving bevat twee resources en de OpenID Connect client mag de eerste resource direct aanroepen. De OpenID Connect client mag de tweede resource NIET direct aanroepen. Op de eerste resource is een client geconfigureerd die access tokens met de client/resource audience mag exchangen naar een access token dat geldig is voor de tweede resource.
De volgende client op de eerste resource is geconfigureerd met een certificaat als client credential.

Tijdens de token exchange sequentie worden claims transformations en limitations uitgevoerd op de applicatieregistratie.
De OpenID Connect client roept de eerste resource aan met het verkregen access token. De resource client doet een token exchange call naar FoxIDs, authenticert de client en stuurt het access token terwijl (met een scope) om een access token voor de tweede resource wordt gevraagd. Bij succes ontvangt de resource client een access token terug en kan nu de tweede resource aanroepen met het access token.
Voorbeeld token exchange POST request naar het token endpoint:
POST https://foxids.com/test-corp/-/aspnet_oidc_allup_online_sample(*)/oauth/token HTTP/1.1
Host: foxids.com
Content-Type: application/x-www-form-urlencoded
client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGciOiI...kyX3NhbXBsZS
&grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&scope=aspnetcore_api2_sample%3Asome_2_access
&subject_token=accVkjcJyb4...C5PbRDqceLTC
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token
Voorbeeld token exchange JSON response:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store
{
"access_token":"eyJhGcRwczov...nNjb3BlIjoi",
"issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
"token_type":"Bearer",
"expires_in":600
}
Voorbeeld JWT access token body:
{
"sub": "2f18c344-1204-4629-b992-215913b85c2b",
"auth_time": "1699955841",
"amr": "pwd",
"act": "{\"sub\":\"c_aspnetcore_api1_sample\"}",
"scope": "aspnetcore_api2_sample:some_2_access",
"client_id": "aspnetcore_api1_sample",
"nbf": 1699955786,
"exp": 1699956446,
"iat": 1699955846,
"iss": "https://foxids.com/test-corp/-/",
"aud": "aspnetcore_api2_sample"
}
Token exchange via trust
Via externe trust naar IdP/OP is het mogelijk om een access token of SAML 2.0 token uitgegeven door een externe partij (of een andere FoxIDs omgeving) te token exchangen en daarmee een access token voor een resource in de omgeving te verkrijgen.
Er wordt een authenticatiemethode trust geconfigureerd en een applicatieregistratie client wordt geconfigureerd om token exchange toe te staan op basis van de authenticatiemethode trust(s). De applicatieregistratie client whitelists bovendien voor welke resources in de omgeving token exchange is toegestaan.
Het is mogelijk om te configureren of de authenticatiemethode trust moet worden toegestaan voor token exchange en gebruikersauthenticatie. Standaard zijn beide toegestaan op OAuth 2.0, OpenID Connect en SAML 2.0 authenticatiemethode trusts.

Access Token naar Access Token via trust
Token exchange van een extern JWT access token naar een intern JWT access token via externe trust.
In dit scenario vertrouwt een OpenID Connect client een externe OpenID Provider (OP) / Identity Provider (IdP) en heeft een access token verkregen na gebruikersauthenticatie.
De client kan ook een OAuth 2.0 client zijn die client credentials grant gebruikt om het externe access token te verkrijgen.
Er is een resource in de omgeving maar de extern gedefinieerde OpenID Connect client mag de resource NIET direct aanroepen.
Eerst wordt een OAuth 2.0 of OpenID Connect authenticatiemethode geconfigureerd om de externe OpenID Provider (OP) / Identity Provider (IdP) te vertrouwen en de SP issuer wordt geconfigureerd om te matchen met de audience van de externe OpenID Connect client.
Het volgende externe trust voorbeeld is een trust naar een andere FoxIDs omgeving.

Vervolgens wordt een OAuth 2.0 applicatieregistratie client geconfigureerd om externe access tokens te accepteren via de authenticatiemethode trust. Het is mogelijk om één of meerdere authenticatiemethode trusts te hebben.
De volgende client is geconfigureerd met een secret als client credentials.

Het is daarmee mogelijk om een extern access token te token exchangen naar een intern access token dat geldig is voor de resource.
Tijdens de token exchange sequentie worden zowel claims transformations als limitations eerst op de authenticatiemethode en daarna op de applicatieregistratie uitgevoerd.
De OpenID Connect client backend applicatie doet een token exchange call naar FoxIDs. Deze authenticert de interne OAuth 2.0 client en stuurt het externe access token terwijl (met een scope) om een access token voor de resource wordt gevraagd. Bij succes ontvangt de OpenID Connect client backend applicatie een access token terug en kan nu de resource aanroepen.
Voorbeeld token exchange POST request naar het token endpoint:
POST https://foxids.com/test-corp/-/aspnet_oidc_allup_online_sample(*)/oauth/token HTTP/1.1
Host: foxids.com
Content-Type: application/x-www-form-urlencoded
client_id=some_external_id
&client_secret=goOxwj8Kz...wUC-3CGs
&grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&scope=aspnetcore_api2_sample%3Asome_2_access
&subject_token=accVkjcJyb4...UC5PbRDqceLTC
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token
Voorbeeld token exchange JSON response:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store
{
"access_token":"eyJhGcjlc...nNjb3IIWvmDCM",
"issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
"token_type":"Bearer",
"expires_in":600
}
SAML 2.0 naar Access Token via trust
Token exchange van extern SAML 2.0 token naar intern JWT access token via externe trust.
In dit scenario vertrouwt een SAML 2.0 applicatie een externe Identity Provider (IdP) en heeft een SAML 2.0 token verkregen na gebruikersauthenticatie.
Er is een resource in de omgeving maar de extern gedefinieerde SAML 2.0 applicatie mag de resource NIET direct aanroepen.
Eerst wordt een SAML 2.0 authenticatiemethode geconfigureerd om de Identity Provider (IdP) te vertrouwen en de SP issuer wordt geconfigureerd om te matchen met de audience van de externe SAML 2.0 applicatie.
Het volgende externe trust voorbeeld is een trust naar een FoxIDs SAML 2.0 applicatieregistratie.

Vervolgens wordt een OAuth 2.0 applicatieregistratie client geconfigureerd om externe SAML 2.0 tokens te accepteren via de authenticatiemethode trust. Het is mogelijk om één of meerdere authenticatiemethode trusts te hebben.
De volgende client is geconfigureerd met een certificaat als client credentials.

Het is daarmee mogelijk om een extern SAML 2.0 token te token exchangen naar een intern access token dat geldig is voor de resource.
Tijdens de token exchange sequentie worden zowel claims transformations als limitations eerst op de authenticatiemethode en daarna op de applicatieregistratie uitgevoerd.
De SAML 2.0 backend applicatie doet een token exchange call naar FoxIDs. Deze authenticert de interne OAuth 2.0 client en stuurt het externe SAML 2.0 token terwijl (met een scope) om een access token voor de resource wordt gevraagd. Bij succes ontvangt de SAML 2.0 backend applicatie een access token terug en kan nu de resource aanroepen.
Voorbeeld token exchange POST request naar het token endpoint:
POST https://foxids.com/test-corp/-/aspnet_oidc_allup_online_sample(*)/oauth/token HTTP/1.1
Host: foxids.com
Content-Type: application/x-www-form-urlencoded
client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGciOiI...kyX3NhbXBsZS
&grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&scope=aspnetcore_api2_sample%3Asome_2_access
&subject_token=%3Csaml%3AAssertion%20xmlns%3Asaml...%3AAssertion%3E%0A
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Asaml2
Voorbeeld token exchange JSON response:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store
{
"access_token":"eyJhGcRwczov...nNjb3BlIjoi",
"issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
"token_type":"Bearer",
"expires_in":600
}