2017-11-02 7 views
0

を主張する、と私は私のaccess_tokenはにいくつかのカスタムクレームを追加したいです。私は、カスタムIProfileServiceを実装して、私のstartup.csに加えて、それは一種の私が説明させ、作品:IProfileServiceの私のカスタムテストの実装がアイデンティティ・サーバー4カスタムユーザーは、だから私は学習されており、現在は月のアイデンティティサーバー4で作業

public class MyProfileService : IProfileService 
    { 
     public Task GetProfileDataAsync(ProfileDataRequestContext context) 
     {    
      var claims = new List<Claim>();    
      claims.Add(new Claim("FullName", "Joe")); 
      claims.Add(new Claim("FullName", "Tester")); 
      context.IssuedClaims = claims; 
      return Task.FromResult(0); 
     } 

     public Task IsActiveAsync(IsActiveContext context) 
     { 
      context.IsActive = true; 
      return Task.FromResult(0); 
     } 
    } 

すなわち。

services.AddTransient<IProfileService, MyProfileService>(); 

ので access_tokenは私のに私はカスタム要求を取得し、その部分は素晴らしいですが、私はのための役割を取得したい:その後、私はこのような私のstartup.csに追加します私のユーザは、自分のデータベースから自分の役割を得るためにサインアップしようとしているユーザーをどのようにして取得できますか、それは私が苦労している部分です。私はデータベースから必要なクレームを得ることができるようにどのように私はASP.netアイデンティティからユーザーとロールのDbContextsを注入することができますが、私は実際にサインアップしているユーザーを得ることができます。

答えて

0

GetProfileDataAsyncは、トークンエンドポイントからaccess_tokenを取得すると呼び出されます。 Context.Caller = ClaimsProviderAccessToken。 Context.Caller = UserInfoEndpoint:あなたはのUserInfoエンドポイントからの情報を取得する場合サイドノートとして

GetProfileDataAsyncも呼ばれています。デフォルトでは、トークンエンドポイントだけが呼び出されます。

context.RequestedClaimTypesには、発信者のコンテキストに関するすべての要求クレームが含まれています。このコレクションは、principal.Claimsコレクションから要求されたクレームをフィルタリングするために使用されます。

public async Task GetProfileDataAsync(ProfileDataRequestContext context) 
{ 
    var sub = context.Subject.GetSubjectId(); 
    var user = await _userManager.FindByIdAsync(sub); 
    var principal = await _claimsFactory.CreateAsync(user); 

    // Get all claims and filter it by requested claims. 
    var claims = principal.Claims 
        .Where(claim => context.RequestedClaimTypes.Contains(claim.Type)).ToList(); 

    context.IssuedClaims = claims; 
} 

コンテキスト内ですべての情報を使用できるため、追加のデータベースコンテキストは必要ありません。

コレクションからクレームを追加するには、要求されたクレームリストにクレームを追加する必要があります。 Apiリソースの場合、ApiClaimsテーブルとApiScopeClaimsテーブルを使用できます。 IDリソースの場合は、IdentityClaimsテーブルに要求を追加できます。

type = roleのIdentityClaimsにレコードを追加することで、自分で試すことができます。これは役割を見るのに十分なはずです。この方法で、ハードコーディング規則の代わりにIdentityServerを構成できます。別のオプションである:

principal.Claims.Where(claim => claim.Type == JwtClaimTypes.Role).ToList() 
       .ForEach(claim => claims.Add(claim)); 

しかし、私は、これは非常に一般的なソリューションであり、あなたが1つまたはいくつかのアプリケーションとUserInfoEndpointを呼び出すことはありませんを持っている場合にのみ動作するかもしれないと思います。

+0

最近更新されたこの記事もお読みください:https://www.scottbrady91.com/Identity-Server/Getting-Started-with-IdentityServer-4 –

関連する問題