/// <summary> /// Registers the <see cref="DbContext"/> to be used by the Identity system. /// </summary> /// <param name="options">Options for configuring the IdentityServer API feature.</param> /// <param name="configureAction">Configuration for <see cref="ExtendedIdentityDbContext{TUser, TRole}"/>.</param> public static void AddDbContext(this IdentityServerApiEndpointsOptions options, Action <IdentityDbContextOptions> configureAction) { var dbContextOptions = new IdentityDbContextOptions(); configureAction?.Invoke(dbContextOptions); options.Services.AddSingleton(dbContextOptions); options.Services.AddDbContext <ExtendedIdentityDbContext <User, Role> >(dbContextOptions.ConfigureDbContext); }
public async Task <IActionResult> GetUsers([FromQuery] ListOptions <UserListFilter> options) { var query = _dbContext.Users.AsNoTracking(); if (options?.Filter != null) { var filter = options.Filter; query = query.Where(x => filter.Claim == null || x.Claims.Any(x => x.ClaimType == filter.Claim.Type && x.ClaimValue == filter.Claim.Value)); } // https://docs.microsoft.com/en-us/ef/core/querying/complex-query-operators var usersQuery = from user in query join fnl in _dbContext.UserClaims on new { user.Id, ClaimType = JwtClaimTypes.GivenName } equals new { Id = fnl.UserId, fnl.ClaimType } into fnLeft from fn in fnLeft.DefaultIfEmpty() join lnl in _dbContext.UserClaims on new { user.Id, ClaimType = JwtClaimTypes.FamilyName } equals new { Id = lnl.UserId, lnl.ClaimType } into lnLeft from ln in lnLeft.DefaultIfEmpty() select new UserInfo { Id = user.Id, FirstName = fn.ClaimValue, LastName = ln.ClaimValue, Email = user.Email, EmailConfirmed = user.EmailConfirmed, PhoneNumber = user.PhoneNumber, PhoneNumberConfirmed = user.PhoneNumberConfirmed, UserName = user.UserName, CreateDate = user.CreateDate, LockoutEnabled = user.LockoutEnabled, LockoutEnd = user.LockoutEnd, TwoFactorEnabled = user.TwoFactorEnabled, Blocked = user.Blocked, PasswordExpirationPolicy = user.PasswordExpirationPolicy, IsAdmin = user.Admin, AccessFailedCount = user.AccessFailedCount, LastSignInDate = user.LastSignInDate, PasswordExpirationDate = user.PasswordExpirationDate }; if (options?.Search?.Length > 2) { var userSearchFilterExpression = await IdentityDbContextOptions.UserSearchFilter(_dbContext, options.Search); usersQuery = usersQuery.Where(userSearchFilterExpression); } if (options?.Filter?.UserId?.Any() == true) { usersQuery = usersQuery.Where(x => options.Filter.UserId.Contains(x.Id)); } return(Ok(await usersQuery.ToResultSetAsync(options))); }