0

IdentityServer4を使用していて、トークンの作成時にカスタムデフォルトクレームをCLIENTに追加しようとしています。これは暗黙的なフローを使用し、IProfileServiceを以下のように使用すると可能です。IdentityServer4:Client_Credentialのクライアントプリンシパルにカスタムデフォルトクレームを追加する

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); 
    } 
} 

そして、私のスタートアップで

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

それはcannot request OpenID scopes in client credentials flowようですので、これはclient_credential granttypeと私のクライアントでは動作しません。名前のようにIprofileserviceはIdentityのために働いていますOpenIdスコープがプロファイルのようなリソースは有効です。なぜなら、client_credentialグラントタイプGetProfileDataAsyncがプロファイルスコープを要求できないからです。

よう

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") 
    } 
} 

の下にクライアントオブジェクトにそれらを追加することなく、クライアントと私はトークンにクレームを注入する方法が必要がないユーザーでのみ働いているので、私はので、私は上記を望んでいませんこのクレームをデータベース内のclient_claimsの一部にすることは望ましくありません。私はトークン要求でそれをオンザフライで作成する必要があります。私の質問がより明確になることを願っています。

+0

を 'IProfileService'取得者をICustomTokenRequestValidatorを拡張して、Startup.cs徹底的な依存性の注入で私のクラスを含める必要がありましたことを行うために

'access_token'が生成されたときに呼び出されます - それはそれにクレームを追加するために使用されます。 – moritzg

+0

また、次のように 'IProfileService'を追加しています:' Services.AddTransient (); '(スタートアップ> ConfigureServices内)があなたの問題でしょうか? – moritzg

+0

'AddProfileService'は正しいメソッドです。 – Mardoxx

答えて

1

いくつかのお問い合わせで、私は最終的にこれを行う方法を見つけました。トークンが要求されたときに、クライアントにクレームを動的に追加する方法が必要でした。私はStartup.cs

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.AddTransient<ICustomTokenRequestValidator, DefaultClientClaimsAdder>(); 
関連する問題