Skip to content

Commit

Permalink
feat: Support for updating claim data when configuring UpdateAccessio…
Browse files Browse the repository at this point in the history
…nTokenClaimsOnRefresh on the client side (#1283)
  • Loading branch information
wzh425 authored Apr 24, 2024
1 parent aec1f59 commit 4e08233
Showing 1 changed file with 40 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,35 +25,13 @@ public async Task GetProfileDataAsync(ProfileDataRequestContext context)
var subjectId = context.Subject.Claims.FirstOrDefault(c => c.Type == "sub");
if (subjectId != null && Guid.TryParse(subjectId.Value, out var userId))
{
var request = _httpContextAccessor.HttpContext?.Request;
if (request != null)
{
if (request.HasFormContentType && request.Form.TryGetValue("scheme", out var scheme))
{
var authUser = await _authClient.UserService.GetThirdPartyUserByUserIdAsync(new GetThirdPartyUserByUserIdModel
{
Scheme = scheme,
UserId = userId
});

if (authUser != null)
{
foreach (var item in authUser.ClaimData)
{
context.IssuedClaims.TryAdd(new Claim(item.Key, item.Value));
}
}
}
}

var claimValues = await _authClient.UserService.GetClaimValuesAsync(userId);
foreach (var claimValue in claimValues)
{
if (!context.IssuedClaims.Any(x=>x.Type == claimValue.Key))
{
context.IssuedClaims.TryAdd(new Claim(claimValue.Key, claimValue.Value));
}
AddOrUpdateClaims(context.IssuedClaims, new Claim(claimValue.Key, claimValue.Value), x => x.Type == claimValue.Key);
}

await AddThirdPartyClaimsAsync(context, userId);
}
}
}
Expand All @@ -63,4 +41,41 @@ public Task IsActiveAsync(IsActiveContext context)
context.IsActive = true;
return Task.CompletedTask;
}

private async Task AddThirdPartyClaimsAsync(ProfileDataRequestContext context, Guid userId)
{
var request = _httpContextAccessor.HttpContext?.Request;
if (request != null)
{
if (request.HasFormContentType && request.Form.TryGetValue("scheme", out var scheme))
{
var authUser = await _authClient.UserService.GetThirdPartyUserByUserIdAsync(new GetThirdPartyUserByUserIdModel
{
Scheme = scheme,
UserId = userId
});

if (authUser != null)
{
foreach (var item in authUser.ClaimData)
{
AddOrUpdateClaims(context.IssuedClaims, new Claim(item.Key, item.Value), x => x.Type == item.Key);
}
}
}
}
}

private void AddOrUpdateClaims(List<Claim> list, Claim item, Predicate<Claim> match)
{
int index = list.FindIndex(match);
if (index != -1)
{
list[index] = item;
}
else
{
list.Add(item);
}
}
}

0 comments on commit 4e08233

Please sign in to comment.