に特定の要求のためのクレーム変換を避けるために、どのように、私は、現在のユーザーを認証用の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
からJwtBearerEvents
のOnTokenValidated
一部にクレーム変換をフックすることができhereを見つけました。残念ながら、MyClaimsPrincipal
を上書きし、別の未知のミドルウェアがあります。私は、あなたが匿名アクセスをテストするために、あなたのClaimsTransformerで次のチェックを使用することができます。..
これは便利です..しかし、私は実際に時間に最高の場所を見つけました私は独自の 'ClaimsPrincipal'を作成することはできませんが、私は独自の' ClaimsIdentity'を作成して、 – Learner
@Learnerに追加データを添付することを考えています。あなたはClaimsPrincipalに簡単に拡張メソッドを追加することができます。独自のアイデンティティクラスを提供する代わりにClaimsIdentityを使用する – quetzalcoatl
@Quetzalcoatlしかし、私は追加のクレームだけでなく、完全なオブジェクトを付けたいので、自分のアイデンティティを作成し、それをアイデンティティに追加してから、認可ハンドラ – Learner