Token exchange
FoxIDs stödjer två olika scenarier för token exchange: token exchange i samma miljö och token exchange via trust.
I samma miljö är det möjligt att göra token exchange av access tokens i en webbapplikation eller API/resource till en annan resurs.
Via extern trust är det möjligt att göra token exchange av externa access tokens och SAML 2.0 tokens till interna access tokens.
Samples
Token exchange är implementerat i följande samples:
- AspNetCoreOidcAuthCodeAllUpPartiesSample, visar token exchange från access token till access token inne i en webbplats backend
- AspNetCoreSamlSample, visar token exchange från SAML 2.0 token till access token
- AspNetCoreApi1Sample, visar token exchange från access token till access token inne i ett API
Du kan testa token exchange med online web app sample (sample docs) genom att klicka
Log inoch logga in med en valfri IdP. Klicka sedanCall API1 which call API2ellerToken Exchange + Call Api2för att anropa ett API med token exchange.
Ta en titt på sample konfigurationen i FoxIDs Control: https://control.foxids.com/test-corp
Få read access med användarenreader@foxids.comoch lösenordgEh#V6kSw
Applikationsregistrering konfiguration
Det är möjligt att konfigurera om token exchange är tillåtet på OAuth 2.0 applikationsregistrering eller OpenID Connect klient. Det är också möjligt att konfigurera om client credentials grant ska vara tillåtet.
Som standard är både client credentials grant och token exchange tillåtet på OAuth 2.0 applikationsregistreringar och OpenID Connect klienter.
Som standard läggs klienten till som token exchange actor, detta beteende kan inaktiveras.

Token exchange i samma miljö
Det är möjligt att token exchange ett access token som är utfärdat till en resurs och därmed få ett access token för en annan resurs i miljön.
En applikationsregistrering klient är konfigurerad för att hantera token exchange och för att vitlista för vilka resurser i miljön det är tillåtet att göra token exchange.
Access Token till Access Token i webbapplikation
En webbapplikation token exchangar JWT access token till JWT access token i samma miljö.
I detta scenario har en OpenID Connect klient fått ett access token efter användarautentisering.
Klienten kan också vara en OAuth 2.0 klient som använder client credentials grant.
Miljön innehåller två resurser och OpenID Connect klienten är tillåten att anropa både den första och den andra resursen direkt. För att uppnå least privileges får OpenID Connect klienten bara ett access token för den första resursen efter användarautentisering. Och får därefter ett access token för den andra resursen när det behövs.

Det första access token utfärdas med scope/audience för OpenID Connect klienten och klienten får därmed lov att exchange access tokens till ett access token som är giltigt för den andra resursen.
OpenID Connect klienten är konfigurerad med ett secret som client credentials används både i OpenID Connect kommunikationen och token exchange.
Under token exchange sekvensen utförs claims transformations och limitations på OpenID Connect applikationsregistreringen.
OpenID Connect klienten gör ett token exchange anrop till FoxIDs, autentiserar klienten och skickar access token samtidigt som den begär (med scope) ett access token till den andra resursen. Om det lyckas får resursklienten tillbaka ett access token och kan nu anropa den andra resursen med access token.
Exempel token exchange POST request till 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
Exempel 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
}
Exempel 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 till Access Token i API
Ett API token exchangar JWT access token till JWT access token i samma miljö.
I detta scenario har en OpenID Connect klient fått ett access token efter användarautentisering.
Klienten kan också vara en OAuth 2.0 klient som använder client credentials grant.
Miljön innehåller två resurser och OpenID Connect klienten är tillåten att anropa den första resursen direkt. OpenID Connect klienten är INTE tillåten att anropa den andra resursen direkt. På den första resursen är en klient konfigurerad som tillåter access tokens med client/resource audience att exchange till ett access token som är giltigt för den andra resursen.
Den följande klienten på den första resursen är konfigurerad med ett certifikat som client credential.

Under token exchange sekvensen utförs claims transformations och limitations på applikationsregistreringen.
OpenID Connect klienten anropar den första resursen med det mottagna access token. Resursklienten gör ett token exchange anrop till FoxIDs, autentiserar klienten och skickar access token samtidigt som den begär (med scope) ett access token till den andra resursen. Om det lyckas får resursklienten tillbaka ett access token och kan nu anropa den andra resursen med access token.
Exempel token exchange POST request till 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
Exempel 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
}
Exempel 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 extern trust till IdP/OP är det möjligt att token exchange ett access token eller SAML 2.0 token som är utfärdat av en extern part (eller en annan FoxIDs miljö) och därmed få ett access token för en resurs i miljön.
En autentiseringsmetod trust konfigureras och en applikationsregistrering klient konfigureras för att tillåta token exchange baserat på autentiseringsmetod trust(s). Applikationsregistrering klienten vitlistar dessutom vilka resurser i miljön som det är tillåtet att token exchange till.
Det är möjligt att konfigurera om autentiseringsmetod trust ska vara tillåten för token exchange och användarautentisering. Standard är att båda är tillåtna på OAuth 2.0, OpenID Connect och SAML 2.0 autentiseringsmetod trusts.

Access Token till Access Token via trust
Token exchange extern JWT access token till intern JWT access token via extern trust.
I detta scenario litar en OpenID Connect klient på en extern OpenID Provider (OP) / Identity Provider (IdP) och har fått ett access token efter användarautentisering.
Klienten kan också vara en OAuth 2.0 klient som använder client credentials grant för att få det externa access token.
Det finns en resurs i miljön men den externt definierade OpenID Connect klienten är INTE tillåten att anropa resursen direkt.
Först konfigureras en OAuth 2.0 eller OpenID Connect autentiseringsmetod att lita på den externa OpenID Provider (OP) / Identity Provider (IdP) och SP issuer konfigureras att matcha den externa OpenID Connect klientens audience.
Följande externa trust exempel är en trust till en annan FoxIDs miljö.

Därefter konfigureras en OAuth 2.0 applikationsregistrering klient för att acceptera externa access tokens via autentiseringsmetod trust. Det är möjligt att ha en eller flera autentiseringsmetod trusts.
Följande klient är konfigurerad med ett secret som client credentials.

Det är därmed möjligt att token exchange ett externt access token till ett internt access token som är giltigt för resursen.
Under token exchange sekvensen utförs både claims transformations och limitations först på autentiseringsmetoden och därefter på applikationsregistreringen.
OpenID Connect klient backend applikationen gör ett token exchange anrop till FoxIDs. Den autentiserar den interna OAuth 2.0 klienten och skickar det externa access token samtidigt som den begär (med scope) ett access token till resursen. Om det lyckas får OpenID Connect klient backend applikationen tillbaka ett access token och kan nu anropa resursen.
Exempel token exchange POST request till 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
Exempel 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 till Access Token via trust
Token exchange extern SAML 2.0 token till intern JWT access token via extern trust.
I detta scenario litar en SAML 2.0 applikation på en extern Identity Provider (IdP) och har fått ett SAML 2.0 token efter användarautentisering.
Det finns en resurs i miljön men den externt definierade SAML 2.0 applikationen är INTE tillåten att anropa resursen direkt.
Först konfigureras en SAML 2.0 autentiseringsmetod att lita på Identity Provider (IdP) och SP issuer konfigureras att matcha den externa SAML 2.0 applikationens audience.
Följande externa trust exempel är en trust till en FoxIDs SAML 2.0 applikationsregistrering.

Därefter konfigureras en OAuth 2.0 applikationsregistrering klient för att acceptera externa SAML 2.0 tokens via autentiseringsmetod trust. Det är möjligt att ha en eller flera autentiseringsmetod trusts.
Följande klient är konfigurerad med ett certifikat som client credentials.

Det är därmed möjligt att token exchange ett externt SAML 2.0 token till ett internt access token som är giltigt för resursen.
Under token exchange sekvensen utförs både claims transformations och limitations först på autentiseringsmetoden och därefter på applikationsregistreringen.
SAML 2.0 backend applikationen gör ett token exchange anrop till FoxIDs. Den autentiserar den interna OAuth 2.0 klienten och skickar det externa SAML 2.0 token samtidigt som den begär (med scope) ett access token till resursen. Om det lyckas får SAML 2.0 backend applikationen tillbaka ett access token och kan nu anropa resursen.
Exempel token exchange POST request till 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
Exempel 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
}