Thread CT through SecurityStampValidatorCallback.UpdatePrincipal via IHttpContextAccessor

This commit is contained in:
Damian Hickey 2026-02-26 11:41:49 +01:00
parent 2a2fe41b54
commit 90cf6592af
2 changed files with 7 additions and 4 deletions

View file

@ -1,12 +1,14 @@
// Copyright (c) Duende Software. All rights reserved.
// See LICENSE in the project root for license information.
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
namespace Duende.IdentityServer.AspNetIdentity;
public class ConfigureSecurityStampValidatorOptions(ISessionClaimsFilter sessionClaimsFilter) : IConfigureOptions<SecurityStampValidatorOptions>
public class ConfigureSecurityStampValidatorOptions(ISessionClaimsFilter sessionClaimsFilter, IHttpContextAccessor httpContextAccessor) : IConfigureOptions<SecurityStampValidatorOptions>
{
public void Configure(SecurityStampValidatorOptions options) => options.OnRefreshingPrincipal = async context => await SecurityStampValidatorCallback.UpdatePrincipal(context, sessionClaimsFilter);
public void Configure(SecurityStampValidatorOptions options) => options.OnRefreshingPrincipal = async context =>
await SecurityStampValidatorCallback.UpdatePrincipal(context, sessionClaimsFilter, httpContextAccessor.HttpContext?.RequestAborted ?? default);
}

View file

@ -18,15 +18,16 @@ public static class SecurityStampValidatorCallback
/// <param name="sessionClaimsFilter">Instance of session claims filter used to filter the claims from the ClaimsPrincipal to
/// those that are session claims which are not persisted by ASP.NET Identity and would otherwise bee lost when the principal
/// is updated.</param>
/// <param name="ct">The cancellation token.</param>
/// <returns></returns>
public static async Task UpdatePrincipal(SecurityStampRefreshingPrincipalContext context, ISessionClaimsFilter sessionClaimsFilter)
public static async Task UpdatePrincipal(SecurityStampRefreshingPrincipalContext context, ISessionClaimsFilter sessionClaimsFilter, Ct ct)
{
if (context.NewPrincipal == null || !context.NewPrincipal.Identities.Any())
{
return;
}
var currentClaimsToKeep = await sessionClaimsFilter.FilterToSessionClaimsAsync(context, default);
var currentClaimsToKeep = await sessionClaimsFilter.FilterToSessionClaimsAsync(context, ct);
var id = context.NewPrincipal.Identities.First();
id.AddClaims(currentClaimsToKeep);