web-dev-qa-db-ja.com

ASP.NET Core2.0に欠落しているクレーム変換サポート

新しいasp.netコア2.0APIアプリでJWTBearer authを使用しており、現在のIDにいくつかのクレームを追加したいと考えています。この追加情報は、クエリが必要な別のAPIにあります。私の理解では、クレームの変換はこれを行うのに適切な場所です。 .net core 1.1では、Microsoft.AspNetCore.Authentication nugetパッケージにIClaimsTransformerインターフェイスがありますが、これを.net core2.0アプリにインストールできません。 asp.netコア2.0でクレームを変換する別の方法はありますか?これは私のユースケースにとって正しいアプローチですか?

8
terjetyl

ASP.NET Core 2.0では、IClaimsTransformerの名前がIClaimsTransformationに変更されました。

クレーム変換単一のメソッドを使用した、よりシンプルで新しいIClaimsTransformationサービス:タスクTransformAsync(ClaimsPrincipalプリンシパル)AuthenticateAsync呼び出しが成功したときにこれを呼び出します。

services.AddSingleton<IClaimsTransformation, ClaimsTransformer>();

private class ClaimsTransformer : IClaimsTransformation {
    // Can consume services from DI as needed, including scoped DbContexts
    public ClaimsTransformer(IHttpContextAccessor httpAccessor) { }
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal p) {
        p.AddIdentity(new ClaimsIdentity());
        return Task.FromResult(p);
    }
}

https://github.com/aspnet/Security/issues/131 を参照してください

19
Canada Wan

ASP.NET Core 2.0でクレームを変換する別の方法があります。これにより、UserStoreにアクセスできるため、ユーザーのデータを取得して追加できます。クレームとしての情報。基本的に、インターフェイスIUserClaimsPrincipalFactoryの実装を記述し、それを使用して構成し、ConfigureServicesにサービスとしてカスタム実装を追加します。 Startup.csのメソッド。 Core1.xからのCore2.0の主な変更点は、IdentityがIDパイプラインでミドルウェアを使用する代わりに、サービスの依存性注入に依存していることです。カスタムIUserClaimsPrincipalFactoryの作成と、この ブログ投稿 での承認に使用する方法に関する完全な例があります。

これは、ユーザーが管理者であるかどうかのクレームを設定するカスタムクレームファクトリを作成する例です。

    public class MyClaimsPrincipalFactory<TUser>: UserClaimsPrincipalFactory<TUser> where TUser : ApplicationUser
    {
        public MyClaimsPrincipalFactory(
        UserManager<TUser> userManager,
        IOptions<IdentityOptions> optionsAccessor) : base(userManager, 
         optionsAccessor)
       {

        }

    protected override async Task<ClaimsIdentity> GenerateClaimsAsync(TUser user)
    {
        var id = await base.GenerateClaimsAsync(user);
        id.AddClaim(new Claim(MyClaimTypes.IsAdmin, user.IsAdministrator.ToString().ToLower()));
        return id;
    }
  }

そして、これがカスタムファクトリを注入する方法です。

services.AddTransient<IUserClaimsPrincipalFactory<ApplicationUser>, MyClaimsPrincipalFactory<ApplicationUser>>();
5
Kevin Junghans