1

Identityコンセプト全体に新しく追加されましたが、私はいくつかのGoogle検索を行いましたが、外部認証を使用してユーザープロファイルをキャッシュする.NET Core IdentityServer4

私は.NET Core 1.0.0とEF CoreとIdentityServer 4(ID4)を使用しています。ID4は別のサーバーにあり、クライアントで取得する唯一の情報はクレームです。私はUser.Identityから、(拡張された)完全なユーザープロフィールにアクセスしたいと思っています。

これで、毎回DBリクエストを送信せずに、User.IdentityにApplicationUserモデルのすべてのプロパティが設定されるように設定する方法はありますか。セッションが終了するまで、認証時に情報をキャッシュに保存したい。

私がしたくないことは、各コントローラで追加情報を取得するためのクエリを設定することです。クライアント上のすべてのコントローラは、ベースコントローラから継承されます。つまり、DIが必要な場合はDIサービスを受けることができます。

ありがとうございます。

クライアント

app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationScheme = "Cookies" 
     }); 

     app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions 
     { 
      AuthenticationScheme = "oidc", 
      SignInScheme = "Cookies", 

      Authority = Configuration.GetSection("IdentityServer").GetValue<string>("Authority"), 
      RequireHttpsMetadata = false, 
      ClientId = "RateAdminApp" 
     }); 

ID4

app.UseIdentity(); 

app.UseIdentityServer(); 

services.AddDeveloperIdentityServer() 
      .AddOperationalStore(builder => builder.UseSqlServer("Server=localhost;Database=Identities;MultipleActiveResultSets=true;Integrated Security=true", options => options.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name))) 
      .AddConfigurationStore(builder => builder.UseSqlServer("Server=localhost;Database=Identities;MultipleActiveResultSets=true;Integrated Security=true", options => options.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name))) 
      .AddAspNetIdentity<ApplicationUser>(); 

ApplicationUserモデルあなたが変換したい場合は

public class ApplicationUser : IdentityUser 
{ 
    [Column(TypeName = "varchar(100)")] 
    public string FirstName { get; set; } 
    [Column(TypeName = "varchar(100)")] 
    public string LastName { get; set; } 
    [Column(TypeName = "nvarchar(max)")] 
    public string ProfilePictureBase64 { get; set; } 
} 

答えて

0

(aspnetアイデンティティを使用する)あなたのケースでは、UserClaimsPrincipalFactoryをオーバーライドすることがアイデンティティーサーバーの主張です(Store data in cookie with asp.net core identityを参照)。

public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole> 
{ 
    public AppClaimsPrincipalFactory(
     UserManager<ApplicationUser> userManager, 
     RoleManager<IdentityRole> roleManager, 
     IOptions<IdentityOptions> optionsAccessor) : base(userManager, roleManager, optionsAccessor) 
    { 
    } 

    public async override Task<ClaimsPrincipal> CreateAsync(ApplicationUser user) 
    { 
     var principal = await base.CreateAsync(user); 

     ((ClaimsIdentity)principal.Identity).AddClaims(new[] { 
      new Claim("FirstName", user.FirstName) 
     }); 

     return principal; 
    } 
} 

// register it 
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AppClaimsPrincipalFactory>(); 

また、あなたは、ユーザがログアウトするまで、それは主張を提供し、クッキーの中に余分な主張を追加する(クライアントアプリケーション上の)イベントを使用することができます。

2(多分以上)のオプションがあります。openidconnect認証のOnTicketReceivedを使用して

まず:

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions 
    { 
     AuthenticationScheme = "oidc", 
     SignInScheme = "Cookies", 

     Authority = Configuration.GetSection("IdentityServer").GetValue<string>("Authority"), 
     RequireHttpsMetadata = false, 
     ClientId = "RateAdminApp", 
     Events = new OpenIdConnectEvents 
     { 
      OnTicketReceived = e => 
      { 
       // get claims from user profile 
       // add claims into e.Ticket.Principal 
       e.Ticket = new AuthenticationTicket(e.Ticket.Principal, e.Ticket.Properties, e.Ticket.AuthenticationScheme); 

       return Task.CompletedTask; 
      } 
     } 
    }); 

またはクッキー認証

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationScheme = "Cookies", 
    Events = new CookieAuthenticationEvents() 
    { 
     OnSigningIn = async (context) => 
     { 
      ClaimsIdentity identity = (ClaimsIdentity)context.Principal.Identity; 
      // get claims from user profile 
      // add these claims into identity 
     } 
    } 
}); 

OnSigningInイベントを使用してのために同様の質問を参照してくださいクライアントアプリケーションのソリューション:Transforming Open Id Connect claims in ASP.Net Core

+0

ユーザープロファイルに追加したいプロパティを追加する必要がありますか?例えば。 ApplicationUserモデルでFirstNameを使用しても実際には値は提供されません。 – Max

+0

IDサーバーにクレームを追加したいですか?私の更新を参照してください。 –

+0

間違いなく私は後になっているものに近づいているように見えます!プロパティの複製に関する私の唯一の懸念は、ユーザーの主張とAspNetUsersプロパティの両方を同期させる必要があることを確認する必要があることです。 しかし、代わりにOnSigningInを使ってcontext.Principal.Identityにすべてのプロパティを選択するだけで、クレームやAspNetUsersのプロパティが同期しなくなるのを避けることができますか? @ adem-caglin – Max

関連する問題