public static IApplicationBuilder UseSimpleAuthServer(this IApplicationBuilder app, IConfiguration configuration, ISimpleAuthServerConfig authConfig = null)
        {
            bool useInMemoryAuthProvider = bool.Parse(configuration.GetValue <String>("InMemoryAuthProvider"));

            if (authConfig == null)
            {
                authConfig = SimpleAuthServerConfigDemo.Get();
            }

            SimpleAuthServerConfiguration.InitializeDatabase(app, configuration, authConfig);

            return(app.UseIdentityServer());
        }
        public static void InitializeDatabase(IApplicationBuilder app, IConfiguration configuration, ISimpleAuthServerConfig authConfig = null)
        {
            if (authConfig == null)
            {
                authConfig = SimpleAuthServerConfigDemo.Get();
            }

            bool useInMemoryAuthProvider = bool.Parse(configuration.GetValue <String>("InMemoryAuthProvider"));

            using (var serviceScope = app.ApplicationServices.GetService <IServiceScopeFactory>().CreateScope())
            {
                if (serviceScope.ServiceProvider.GetServices <SimpleMembershipDbContext>().Count() > 0)
                {
                    var membershiDbpContext = serviceScope.ServiceProvider.GetRequiredService <SimpleMembershipDbContext>();

                    if (!useInMemoryAuthProvider)
                    {
                        membershiDbpContext.Database.Migrate();
                    }

                    if (!membershiDbpContext.Users.Any())
                    {
                        var userMgr = serviceScope.ServiceProvider.GetRequiredService <AppUserManager>();

                        foreach (var testUser in authConfig.GetTestUsers())
                        {
                            var user  = new ApplicationUser();
                            var email = testUser.Claims.Where(t => t.Type == IdentityModel.JwtClaimTypes.Email).FirstOrDefault().Value;
                            user.ConcurrencyStamp = DateTime.Now.Ticks.ToString();
                            user.Email            = email;
                            user.EmailConfirmed   = true;
                            //user.Id = UserSettings.UserId;
                            user.NormalizedEmail    = email;
                            user.NormalizedUserName = testUser.Username;
                            user.UserName           = testUser.Username;

                            var result = userMgr.CreateAsync(user, testUser.Password).Result;
                            if (!result.Succeeded)
                            {
                                throw new Exception(result.Errors.First().Description);
                            }

                            var createdUser = userMgr.FindByNameAsync(testUser.Username).Result;

                            result = userMgr.AddClaimsAsync(createdUser, testUser.Claims).Result;
                            if (!result.Succeeded)
                            {
                                throw new Exception(result.Errors.First().Description);
                            }
                        }
                    }
                }

                if (serviceScope.ServiceProvider.GetServices <PersistedGrantDbContext>().Count() > 0)
                {
                    if (!useInMemoryAuthProvider)
                    {
                        serviceScope.ServiceProvider.GetRequiredService <PersistedGrantDbContext>().Database.Migrate();
                    }
                }

                if (serviceScope.ServiceProvider.GetServices <ConfigurationDbContext>().Count() > 0)
                {
                    var configDbContext = serviceScope.ServiceProvider.GetRequiredService <ConfigurationDbContext>();
                    if (!useInMemoryAuthProvider)
                    {
                        configDbContext.Database.Migrate();
                    }
                    if (!configDbContext.Clients.Any())
                    {
                        foreach (var client in authConfig.GetClients())
                        {
                            configDbContext.Clients.Add(client.ToEntity());
                        }
                        configDbContext.SaveChanges();
                    }

                    if (!configDbContext.IdentityResources.Any())
                    {
                        foreach (var resource in authConfig.GetIdentityResources())
                        {
                            configDbContext.IdentityResources.Add(resource.ToEntity());
                        }
                        configDbContext.SaveChanges();
                    }

                    if (!configDbContext.ApiResources.Any())
                    {
                        foreach (var resource in authConfig.GetApiResources())
                        {
                            configDbContext.ApiResources.Add(resource.ToEntity());
                        }
                        configDbContext.SaveChanges();
                    }
                }
            }
        }
        public static IIdentityServerBuilder AddSimpleAuthServer(this IServiceCollection services, IConfiguration configuration, String migrationsAssembly, String connectionName = "DefaultConnection", ISimpleAuthServerConfig authConfig = null, String publicOrigin = null)
        {
            bool useInMemoryAuthProvider = bool.Parse(configuration.GetValue <String>("InMemoryAuthProvider"));

            if (authConfig == null)
            {
                authConfig = SimpleAuthServerConfigDemo.Get();
            }

            var builder = services.AddIdentityServer(options =>
            {
                options.Events.RaiseErrorEvents       = true;
                options.Events.RaiseInformationEvents = true;
                options.Events.RaiseFailureEvents     = true;
                options.Events.RaiseSuccessEvents     = true;
                if (!String.IsNullOrEmpty(publicOrigin))
                {
                    options.PublicOrigin = publicOrigin;
                }
            });

            if (useInMemoryAuthProvider)
            {
                var identityResources = authConfig.GetIdentityResources();
                if (identityResources != null)
                {
                    builder.AddInMemoryIdentityResources(identityResources);
                }

                var apiResources = authConfig.GetApiResources();
                if (apiResources != null)
                {
                    builder.AddInMemoryApiResources(apiResources);
                }

                var clients = authConfig.GetClients();
                if (clients != null)
                {
                    builder.AddInMemoryClients(clients);
                }


                var testUsers = authConfig.GetTestUsers();
                if (testUsers != null)
                {
                    builder.AddTestUsers(testUsers);
                }
            }
            else
            {
                var connectionString = configuration.GetValue <String>($"ConnectionStrings:{connectionName}");
                builder.AddConfigurationStore(options =>
                {
                    options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
                                                                     sql => sql.MigrationsAssembly(migrationsAssembly));
                })
                .AddOperationalStore(options =>
                {
                    options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
                                                                     sql => sql.MigrationsAssembly(migrationsAssembly));
                });
            }

            services.AddLocalApiAuthentication();

            builder.AddDeveloperSigningCredential();

            return(builder);
        }