Skip to content

Commit

Permalink
move refresh token version upgrade data fixup to serailizer
Browse files Browse the repository at this point in the history
  • Loading branch information
brockallen committed Sep 20, 2022
1 parent f0a2997 commit d6892a2
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 28 deletions.
28 changes: 2 additions & 26 deletions src/IdentityServer/Stores/Default/DefaultRefreshTokenStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,35 +61,11 @@ public Task UpdateRefreshTokenAsync(string handle, RefreshToken refreshToken)
/// </summary>
/// <param name="refreshTokenHandle">The refresh token handle.</param>
/// <returns></returns>
public async Task<RefreshToken> GetRefreshTokenAsync(string refreshTokenHandle)
public Task<RefreshToken> GetRefreshTokenAsync(string refreshTokenHandle)
{
using var activity = Tracing.StoreActivitySource.StartActivity("DefaultRefreshTokenStore.GetRefreshToken");

var refreshToken = await GetItemAsync(refreshTokenHandle);

if (refreshToken != null && refreshToken.Version < 5)
{
#pragma warning disable CS0618 // Type or member is obsolete
var user = new IdentityServerUser(refreshToken.AccessToken.SubjectId);
if (refreshToken.AccessToken.Claims != null)
{
foreach (var claim in refreshToken.AccessToken.Claims)
{
user.AdditionalClaims.Add(claim);
}
}

refreshToken.Subject = user.CreatePrincipal();
refreshToken.ClientId = refreshToken.AccessToken.ClientId;
refreshToken.Description = refreshToken.AccessToken.Description;
refreshToken.AuthorizedScopes = refreshToken.AccessToken.Scopes;
refreshToken.SetAccessToken(refreshToken.AccessToken);
refreshToken.AccessToken = null;
refreshToken.Version = 5;
#pragma warning restore CS0618 // Type or member is obsolete
}

return refreshToken;
return GetItemAsync(refreshTokenHandle);
}

/// <summary>
Expand Down
34 changes: 32 additions & 2 deletions src/Storage/Stores/Serialization/PersistentGrantSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// See LICENSE in the project root for license information.


using Duende.IdentityServer.Models;
using Microsoft.AspNetCore.DataProtection;
using System;
using System.Text.Json;
Expand Down Expand Up @@ -94,7 +95,9 @@ public T Deserialize<T>(string json)

if (container.PersistentGrantDataContainerVersion == 0)
{
return JsonSerializer.Deserialize<T>(json, Settings);
var item = JsonSerializer.Deserialize<T>(json, Settings);
PostProcess(item as RefreshToken);
return item;
}

if (container.PersistentGrantDataContainerVersion == 1)
Expand All @@ -111,11 +114,38 @@ public T Deserialize<T>(string json)
payload = _provider.Unprotect(container.Payload);
}

return JsonSerializer.Deserialize<T>(payload, Settings);
var item = JsonSerializer.Deserialize<T>(payload, Settings);
PostProcess(item as RefreshToken);
return item;
}

throw new Exception($"Invalid version in persisted grant data: '{container.PersistentGrantDataContainerVersion}'.");
}

private void PostProcess(RefreshToken refreshToken)
{
if (refreshToken != null && refreshToken.Version < 5)
{
#pragma warning disable CS0618 // Type or member is obsolete
var user = new IdentityServerUser(refreshToken.AccessToken.SubjectId);
if (refreshToken.AccessToken.Claims != null)
{
foreach (var claim in refreshToken.AccessToken.Claims)
{
user.AdditionalClaims.Add(claim);
}
}

refreshToken.Subject = user.CreatePrincipal();
refreshToken.ClientId = refreshToken.AccessToken.ClientId;
refreshToken.Description = refreshToken.AccessToken.Description;
refreshToken.AuthorizedScopes = refreshToken.AccessToken.Scopes;
refreshToken.SetAccessToken(refreshToken.AccessToken);
refreshToken.AccessToken = null;
refreshToken.Version = 5;
#pragma warning restore CS0618 // Type or member is obsolete
}
}
}

class PersistentGrantDataContainer
Expand Down

0 comments on commit d6892a2

Please sign in to comment.