0

J'utilise IdentityServer4 et j'essaie d'ajouter une réclamation par défaut personnalisée à mon CLIENT lorsque le jeton est créé. Ceci est possible si j'utilise le flux implicite et IProfileService comme indiqué ci-dessous.IdentityServer4: Ajouter une réclamation personnalisée par défaut au Client Principal pour Client_Credential Granttype

public class MyProfileService : IProfileService 
{ 
    public MyProfileService() 
    { 

    } 
    public Task GetProfileDataAsync(ProfileDataRequestContext context) 
    { 
     var claims = new List<Claim> 
     { 
      new Claim("DemoClaimType", "DemoClaimValue") 
     }; 
     context.IssuedClaims = claims; 
     return Task.FromResult(0); 
    } 
    public Task IsActiveAsync(IsActiveContext context) 
    { 
     context.IsActive = true; 
     return Task.FromResult(0); 
    } 
} 

Et dans mon démarrage

services.AddIdentityServer() 
      .AddProfileService<MyProfileService>() 

Toutefois, cela ne fonctionne pas avec mon client avec granttype client_credential car il semble cannot request OpenID scopes in client credentials flow. Il s'avère que Iprofileservice comme le nom l'indique fonctionne pour Identity Ressources pour lesquelles le champ d'application OpenId est valide. étant donné que je suis incapable de demander des étendues de profil avec le type de subvention client_credential, GetProfileDataAsync ne sera jamais appelé.

Depuis je travaille uniquement avec les clients et qu'aucun utilisateur je besoin d'un moyen d'injecter des revendications dans le jeton sans avoir à les ajouter à l'objet client comme ci-dessous

new Client 
{ 
    ClientId = "myclient", 
    ClientName = "My Client", 
    AllowedGrantTypes = GrantTypes.ClientCredentials, 
    ClientSecrets = {new Secret("secret".Sha256())}, 
    AllowedScopes = new List<string> {"api"},      
    AllowOfflineAccess = true, 

    //I Don't want to do this 
    Claims = new List<Claim> 
    { 
     new Claim("type","value") 
    } 
} 

Je ne veux pas ci-dessus parce que je fais ne souhaite pas que la revendication fasse partie des revendications client dans la base de données. Je dois le créer à la volée sur demande de jeton. J'espère que ma question est plus claire maintenant.

+0

Le 'IProfileService' get appelé quand un 'access_token' est généré - il est utilisé pour ajouter des revendications. – moritzg

+0

Nous ajoutons également le 'IProfileService' comme ceci:' services.AddTransient (); '(dans Startup> ConfigureServices) peut-être que c'est votre problème? – moritzg

+0

'AddProfileService' est la méthode correcte. – Mardoxx

Répondre

1

Avec quelques questions, j'ai finalement trouvé comment faire. J'avais besoin d'un moyen d'ajouter dynamiquement des revendications au client lorsque le jeton était demandé.

Pour ce faire, je devais prolonger ICustomTokenRequestValidator puis inclure ma classe dans Startup.cs injection de dépendance complète

public class DefaultClientClaimsAdder : ICustomTokenRequestValidator 
{ 
    public Task ValidateAsync(CustomTokenRequestValidationContext context) 
    { 
     var client = context.Result.ValidatedRequest.Client; 
     client.Claims.Add(new Claim("MyClaimType","MyClaimValue"))); 

     return Task.FromResult(0); 
    } 
} 

services Configurer dans Startup.cs

services.AddTransient<ICustomTokenRequestValidator, DefaultClientClaimsAdder>();