1

に特定の要求のためのクレーム変換を避けるために、どのように、私は、現在のユーザーを認証用のID、サーバーからのいくつかのアイデンティティの主張を持っていると私は、認可の最初のレベルのためのいくつかを使用することができます。しかし、次のステップでは、追加の権限チェックのため、これらの主張は、私は、データベースからより多くのデータを取得する必要があります、十分ではありません。は、APIレベルではAsp.NETコア

私の考えは、データベースからすべてのアクセス許可を添付するカスタムClaimsPrincipalを作成することでしたが、要求ごとにデータベースを2回以上呼び出す必要はありません。

と私の現在の変換方法:私はすでに気づい

public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context) 
{ 
    if (context.Principal.Identity.IsAuthenticated) 
    { 
     var principal = new MyClaimsPrincipal(context.Principal); 
     principal.Permissions = /* load from db */; 
     return Task.FromResult<ClaimsPrincipal>(principal); 
    } 
    return Task.FromResult(context.Principal); 
} 

転換を主張

だから、私はそうのようなパイプラインに追加されMicrosoft.AspNetCore.Authentication.IClaimsTransformerの私の独自の実装を有していると考えましたメソッドは毎回リクエストごとに呼び出されます。だから、認証されたユーザーがいないか、認証が必要ない場合(AllowAnonymousの場合)、余分な権限のチェックが必要ない(理想的な)ときに、データベースを呼び出さないようにしたいと考えています。

私は、クレームの変換は、Identity Serverの認証か何かが、どのようにノーアイデアにバインドする必要があることを感じています。

これについてのご意見はありますか?ありがとうございました!

編集私はIdentityServer4.AccessTokenValidationからJwtBearerEventsOnTokenValidated一部にクレーム変換をフックすることができhereを見つけました。残念ながら、MyClaimsPrincipalを上書きし、別の未知のミドルウェアがあります。私は、あなたが匿名アクセスをテストするために、あなたのClaimsTransformerで次のチェックを使用することができます。..

答えて

2

これがどのように機能するかについて困惑しています。匿名アクセス用の変換をスキップするClaimsTransformerでAnonymousClaimsPrincipal変更

ClaimsPrincipal AnonymousClaimsPrincipal => new ClaimsPrincipal(
    (IIdentity) new ClaimsIdentity(
     (IEnumerable<Claim>) new List<Claim>() { 
      new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", "") 
     } 
    ) 
); 

としてロジックと

using System.Security.Claims; 
using System.Web; 
using System.Web.Security; 

private bool IsAnonymousAccessAllowed => UrlAuthorizationModule.CheckUrlAccessForPrincipal(
    HttpContext.Current.Request.Path, 
    AnonymousClaimsPrincipal, 
    HttpContext.Current.Request.RequestType 
); 

if (!IsAnonymousAccessAllowed && context.Principal.Identity.IsAuthenticated) { /* ... */ } 

(このコードは、MVC5プロジェクトからで、私もそれを願っています.NETコアで動作します。)

+0

これは便利です..しかし、私は実際に時間に最高の場所を見つけました私は独自の 'ClaimsPrincipal'を作成することはできませんが、私は独自の' ClaimsIdentity'を作成して、 – Learner

+1

@Learnerに追加データを添付することを考えています。あなたはClaimsPrincipalに簡単に拡張メソッドを追加することができます。独自のアイデンティティクラスを提供する代わりにClaimsIdentityを使用する – quetzalcoatl

+0

@Quetzalcoatlしかし、私は追加のクレームだけでなく、完全なオブジェクトを付けたいので、自分のアイデンティティを作成し、それをアイデンティティに追加してから、認可ハンドラ – Learner

関連する問題