Token exchange
FoxIDs understøtter to forskellige scenarier for token exchange: token exchange i samme miljø og token exchange ved trust til ekstern IdP/OP.
I samme miljø er det muligt at lave token exchange af access tokens i en web applikation eller API/resource til en anden resource.
Ved ekstern trust er det muligt at lave token exchange af eksterne access tokens og SAML 2.0 tokens til interne access tokens.
Samples
Token exchange er implementeret i følgende samples:
- AspNetCoreOidcAuthCodeAllUpPartiesSample, viser token exchange fra access token til access token inde i en website backend
- AspNetCoreSamlSample, viser token exchange fra SAML 2.0 token til access token
- AspNetCoreApi1Sample, viser token exchange fra access token til access token inde i et API
Du kan teste token exchange med online web app sample (sample docs) ved at klikke
Log inog logge ind med en valgfri IdP. Klik derefterCall API1 which call API2ellerToken Exchange + Call Api2for at kalde et API ved brug af token exchange.
Se sample konfigurationen i FoxIDs Control: https://control.foxids.com/test-corp
Få read access med brugerenreader@foxids.comog passwordgEh#V6kSw
Applikationsregistrering konfiguration
Det er muligt at konfigurere om token exchange er tilladt på OAuth 2.0 applikationsregistreringen eller OpenID Connect klienten. Ligeledes er det muligt at konfigurere om client credentials grant skal være tilladt.
Som standard er både client credentials grant og token exchange tilladt på OAuth 2.0 applikationsregistreringer og OpenID Connect klienter.
Som standard tilføjes klienten som token exchange actor, denne adfærd kan deaktiveres.

Token exchange i samme miljø
Det er muligt at token exchange et access token udstedt til en resource og dermed få et access token til en anden resource i miljøet.
En applikationsregistrering klient konfigureres til at håndtere token exchange og til at whitelist hvilke resources i miljøet den må foretage token exchange til.
Access Token til Access Token i web applikation
En web applikation token exchange JWT access token til JWT access token' i samme miljø.
I dette scenarie har en OpenID Connect klient opnået et access token efter bruger autentificering.
Klienten kan også være en OAuth 2.0 klient der bruger client credentials grant.
Miljøet indeholder to resources og OpenID Connect klienten er tilladt at kalde både den første og anden resource direkte. For at opnå least privileges får OpenID Connect klienten kun et access token til den første resource efter bruger autentificering. Og får derefter et access token til den anden resource når det er nødvendigt.

Det første access token udstedes med scope/audience for OpenID Connect klienten og klienten har dermed tilladelse til at exchange access tokens til et access token' gyldigt for den anden resource.
OpenID Connect klienten er konfigureret med en secret som client credentials brugt både i OpenID Connect kommunikation og token exchange.
Under token exchange sekvensen udføres claims transformations og limitations på OpenID Connect applikationsregistreringen.
OpenID Connect klienten laver et token exchange kald til FoxIDs hvor klienten autentificeres og access token passeres mens der anmodes (med et scope) om et access token' til den anden resource. Hvis det lykkes, får resource klienten et access token' tilbage og kan nu kalde den anden resource med access token'.
Sample token exchange POST request til 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
Sample 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
}
Sample 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 til Access Token i API
Et API token exchange JWT access token til JWT access token' i samme miljø.
I dette scenarie har en OpenID Connect klient opnået et access token efter bruger autentificering.
Klienten kan også være en OAuth 2.0 klient der bruger client credentials grant.
Miljøet indeholder to resources og OpenID Connect klienten er tilladt at kalde den første resource direkte. OpenID Connect klienten er IKKE tilladt at kalde den anden resource direkte. På den første resource er en klient konfigureret til at tillade access tokens med client/resource audience at blive exchanged til et access token' gyldigt for den anden resource.
Den følgende klient på den første resource er konfigureret med et certifikat som client credential.

Under token exchange sekvensen udføres claims transformations og limitations på applikationsregistreringen.
OpenID Connect klienten kalder den første resource med det opnåede access token. Resource klienten laver et token exchange kald til FoxIDs, autentificerer klienten og passer access token mens der anmodes (med et scope) om et access token' til den anden resource. Hvis det lykkes, får resource klienten et access token' tilbage og kan nu kalde den anden resource med access token'.
Sample token exchange POST request til 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
Sample 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
}
Sample 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 ved trust
Ved ekstern trust til IdP/OP er det muligt at token exchange et access token eller SAML 2.0 token udstedt af en ekstern part (eller et andet FoxIDs miljø) og dermed opnå et access token til en resource i miljøet.
En autentificeringsmetode trust konfigureres og en applikationsregistrering klient konfigureres til at tillade token exchange baseret på autentificeringsmetode trust(s). Applikationsregistrering klienten whitelister desuden hvilke resources i miljøet den må lave token exchange til.
Det er muligt at konfigurere om autentificeringsmetode trust skal være tilladt for token exchange og bruger autentificering. Som standard er begge tilladt på en OAuth 2.0, OpenID Connect og SAML 2.0 autentificeringsmetode trust.

Access Token til Access Token ved trust
Token exchange eksternt JWT access token til internt JWT access token ved ekstern trust.
I dette scenarie stoler en OpenID Connect klient på en ekstern OpenID Provider (OP) / Identity Provider (IdP) og har opnået et access token efter bruger autentificering.
Klienten kan også være en OAuth 2.0 klient der bruger client credentials grant til at opnå det eksterne access token.
Der er en resource i miljøet men den eksternt definerede OpenID Connect klient er IKKE tilladt at kalde resourcen direkte.
Først konfigureres en OAuth 2.0 eller OpenID Connect autentificeringsmetode til at stole på den eksterne OpenID Provider (OP) / Identity Provider (IdP) og SP issuer konfigureres til at matche den eksterne OpenID Connect klientens audience.
Det følgende eksterne trust eksempel er en trust til et andet FoxIDs miljø.

Derefter konfigureres en OAuth 2.0 applikationsregistrering klient til at acceptere eksterne access tokens via autentificeringsmetode trust. Det er muligt at have en eller flere autentificeringsmetode trusts.
Den følgende klient er konfigureret med en secret som client credentials.

Det er dermed muligt at token exchange et eksternt access token til et internt access token gyldigt for resourcen.
Under token exchange sekvensen udføres både claims transformations og limitations først på autentificeringsmetoden og derefter på applikationsregistreringen.
OpenID Connect klient backend applikationen laver et token exchange kald til FoxIDs. Den autentificerer den interne OAuth 2.0 klient og passer det eksterne access token mens der anmodes (med et scope) om et access token til resourcen. Hvis det lykkes, får OpenID Connect klient backend applikationen et access token tilbage og kan nu kalde resourcen.
Sample token exchange POST request til 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
Sample 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 til Access Token ved trust
Token exchange eksternt SAML 2.0 token til internt JWT access token ved ekstern trust.
I dette scenarie stoler en SAML 2.0 applikation på en ekstern Identity Provider (IdP) og har opnået et SAML 2.0 token efter bruger autentificering.
Der er en resource i miljøet men den eksternt definerede SAML 2.0 applikation er IKKE tilladt at kalde resourcen direkte.
Først konfigureres en SAML 2.0 autentificeringsmetode til at stole på Identity Provider (IdP) og SP issuer konfigureres til at matche den eksterne SAML 2.0 applikations audience.
Det følgende eksterne trust eksempel er en trust til en FoxIDs SAML 2.0 applikationsregistrering.

Derefter konfigureres en OAuth 2.0 applikationsregistrering klient til at acceptere eksterne SAML 2.0 tokens via autentificeringsmetode trust. Det er muligt at have en eller flere autentificeringsmetode trusts.
Den følgende klient er konfigureret med et certifikat som client credentials.

Det er dermed muligt at token exchange et eksternt SAML 2.0 token til et internt access token gyldigt for resourcen.
Under token exchange sekvensen udføres både claims transformations og limitations først på autentificeringsmetoden og derefter på applikationsregistreringen.
SAML 2.0 backend applikationen laver et token exchange kald til FoxIDs. Den autentificerer den interne OAuth 2.0 klient og passer det eksterne SAML 2.0 token mens der anmodes (med et scope) om et access token til resourcen. Hvis det lykkes, får SAML 2.0 backend applikationen et access token tilbage og kan nu kalde resourcen.
Sample token exchange POST request til 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
Sample 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
}