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