1

アイデンティティの概念全体は初めてですが、Google で 2 回検索しましたが、適切だと感じた回答が見つかりませんでした。

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

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

私がやりたくないのは、各コントローラーでクエリを設定して追加情報を取得することです。クライアント上のすべてのコントローラはベース コントローラから継承されます。つまり、必要に応じて何らかのサービスを 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; }
}
4

1 に答える 1

0

ID サーバーでクレームを変換する場合は、(aspnet ID を使用する) オーバーライドUserClaimsPrincipalFactoryが解決策です (「asp.net コア ID を使用して Cookie にデータを保存する」を参照)。

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>();

また、(クライアント アプリケーションで) イベントを使用して、追加のクレームを Cookie に追加することもできます。これは、ユーザーがログアウトするまでクレームを提供します。

2 つ (おそらくそれ以上) のオプションがあります。

OnTicketReceivedopenidconnect 認証の最初の使用:

    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;
            }
        }
    });

またはOnSigningInCookie認証のイベントを利用する

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
         }
     }
});

クライアント アプリケーションでの解決策については、同様の質問を参照してください: ASP.Net Core での Open Id Connect クレームの変換

于 2016-10-07T07:50:42.167 に答える