使用外部认证缓存用户配置文件.net Core IdentityServer4

本文关键字:配置文件 net Core IdentityServer4 用户 缓存 外部 认证 | 更新日期: 2023-09-27 18:12:03

对整个身份概念很陌生,但我在谷歌上搜索了几次,还没有找到一个我觉得合适的答案。

我使用。net Core 1.0.0与EF Core和IdentityServer 4 (ID4)。ID4位于单独的服务器上,我在客户机中获得的唯一信息是索赔。我希望能够访问完整的(扩展的)用户配置文件,最好是从user . identity。

那么我如何设置让用户。身份是用ApplicationUser模型上的所有属性填充的,而不是每次都发送DB请求?我希望在身份验证时将信息存储在缓存中,直到会话结束。

我不想做的是在每个控制器中设置一个查询来获取附加信息。客户端上的所有控制器都将继承一个基本控制器,这意味着如果有必要,我可以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>();
<<p> ApplicationUser模型/strong>
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; }
}

使用外部认证缓存用户配置文件.net Core IdentityServer4

如果您想在身份服务器上转换声明,对于您的情况(您使用asp.net身份)重写UserClaimsPrincipalFactory是一个解决方案(参见使用asp.net核心身份在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中添加额外的声明,它提供声明直到用户注销。

有两个(可能不止)选项:

首先使用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;
            }
        }
    });

或使用OnSigningIn事件的cookie认证

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中转换Open Id Connect声明。网络核心