|
|
|
@ -0,0 +1,33 @@
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using Microsoft.AspNetCore.Identity;
|
|
|
|
|
|
|
|
|
|
namespace Volo.Abp.Identity.AspNetCore
|
|
|
|
|
{
|
|
|
|
|
public class AbpSecurityStampValidatorCallback
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Implements callback for SecurityStampValidator's OnRefreshingPrincipal event.
|
|
|
|
|
/// https://github.com/IdentityServer/IdentityServer4/blob/main/src/AspNetIdentity/src/SecurityStampValidatorCallback.cs
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class SecurityStampValidatorCallback
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Maintains the claims captured at login time that are not being created by ASP.NET Identity.
|
|
|
|
|
/// This is needed to preserve claims such as idp, auth_time, amr.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="context">The context.</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public static Task UpdatePrincipal(SecurityStampRefreshingPrincipalContext context)
|
|
|
|
|
{
|
|
|
|
|
var newClaimTypes = context.NewPrincipal.Claims.Select(x => x.Type).ToArray();
|
|
|
|
|
var currentClaimsToKeep = context.CurrentPrincipal.Claims.Where(x => !newClaimTypes.Contains(x.Type)).ToArray();
|
|
|
|
|
|
|
|
|
|
var id = context.NewPrincipal.Identities.First();
|
|
|
|
|
id.AddClaims(currentClaimsToKeep);
|
|
|
|
|
|
|
|
|
|
return Task.CompletedTask;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|