diff --git a/access-token-management/src/AccessTokenManagement.OpenIdConnect/UserToken.cs b/access-token-management/src/AccessTokenManagement.OpenIdConnect/UserToken.cs
index 8e2826fa2..72fb3f70c 100644
--- a/access-token-management/src/AccessTokenManagement.OpenIdConnect/UserToken.cs
+++ b/access-token-management/src/AccessTokenManagement.OpenIdConnect/UserToken.cs
@@ -12,4 +12,11 @@ public class UserToken : ClientCredentialsToken
/// The refresh token
///
public string? RefreshToken { get; set; }
+
+ ///
+ /// The identity token that may be populated by the OP when refreshing the access token. This
+ /// value is not stored, but available should some OP's require to send this value, for example
+ /// during logout.
+ ///
+ public string? IdentityToken { get; set; }
}
\ No newline at end of file
diff --git a/access-token-management/src/AccessTokenManagement.OpenIdConnect/UserTokenEndpointService.cs b/access-token-management/src/AccessTokenManagement.OpenIdConnect/UserTokenEndpointService.cs
index 2f239c08a..46a303af9 100644
--- a/access-token-management/src/AccessTokenManagement.OpenIdConnect/UserTokenEndpointService.cs
+++ b/access-token-management/src/AccessTokenManagement.OpenIdConnect/UserTokenEndpointService.cs
@@ -135,6 +135,7 @@ public async Task RefreshAccessTokenAsync(
}
else
{
+ token.IdentityToken = response.IdentityToken;
token.AccessToken = response.AccessToken;
token.AccessTokenType = response.TokenType;
token.DPoPJsonWebKey = dPoPJsonWebKey;
diff --git a/access-token-management/test/AccessTokenManagement.Tests/UserTokenManagementTests.cs b/access-token-management/test/AccessTokenManagement.Tests/UserTokenManagementTests.cs
index 2b27c5749..5f264baba 100644
--- a/access-token-management/test/AccessTokenManagement.Tests/UserTokenManagementTests.cs
+++ b/access-token-management/test/AccessTokenManagement.Tests/UserTokenManagementTests.cs
@@ -212,6 +212,7 @@ public async Task Short_token_lifetime_should_trigger_refresh()
// Respond to refresh with a short token lifetime so that we trigger another refresh on 2nd use
var refreshTokenResponse = new
{
+ id_token = "refreshed1_id_token",
access_token = "refreshed1_access_token",
token_type = "token_type1",
expires_in = 10,
@@ -225,6 +226,7 @@ public async Task Short_token_lifetime_should_trigger_refresh()
// Respond to second refresh with a long token lifetime so that we don't trigger another refresh on 3rd use
var refreshTokenResponse2 = new
{
+ id_token = "refreshed2_id_token",
access_token = "refreshed2_access_token",
token_type = "token_type2",
expires_in = 3600,
@@ -245,6 +247,7 @@ public async Task Short_token_lifetime_should_trigger_refresh()
token.ShouldNotBeNull();
token.IsError.ShouldBeFalse();
+ token.IdentityToken.ShouldBe("refreshed1_id_token");
token.AccessToken.ShouldBe("refreshed1_access_token");
token.AccessTokenType.ShouldBe("token_type1");
token.RefreshToken.ShouldBe("refreshed1_refresh_token");
@@ -256,6 +259,7 @@ public async Task Short_token_lifetime_should_trigger_refresh()
token.ShouldNotBeNull();
token.IsError.ShouldBeFalse();
+ token.IdentityToken.ShouldBe("refreshed2_id_token");
token.AccessToken.ShouldBe("refreshed2_access_token");
token.AccessTokenType.ShouldBe("token_type2");
token.RefreshToken.ShouldBe("refreshed2_refresh_token");