using System.Linq; using System.Threading.Tasks; using Duende.IdentityServer.Models; using Duende.IdentityServer.Validation; namespace LiteCharmsSecurity.STS.Identity.Helpers { public class DelegationGrantValidator : IExtensionGrantValidator { private readonly ITokenValidator _validator; public DelegationGrantValidator(ITokenValidator validator) { _validator = validator; } public string GrantType => "delegation"; public async Task ValidateAsync(ExtensionGrantValidationContext context) { var userToken = context.Request.Raw.Get("token"); if (string.IsNullOrEmpty(userToken)) { context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant); return; } var result = await _validator.ValidateAccessTokenAsync(userToken); if (result.IsError) { context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant); return; } // get user's identity var sub = result.Claims.FirstOrDefault(c => c.Type == "sub").Value; context.Result = new GrantValidationResult(sub, GrantType); return; } } }