private static void EnsureDataStorageIsReady(IConfiguration config, IServiceProvider services) { var storage = config["DevOptions:DbPlatform"]; switch (storage) { case "NoDb": CoreNoDbStartup.InitializeDataAsync(services).Wait(); // you can use this hack to add clients and scopes into the db during startup if needed // I used this before we implemented the UI for adding them // you should not use this on the first run that actually creates the initial cloudscribe data // you must wait until after that and then you can get the needed siteid from the database // this will only run at startup time and only add data if no data exists for the given site. // if you pass in an invalid siteid it will not fail, you will get data with a bad siteid // make note of your siteid, don't use these, these are from my NoDb storage // site1 05301194-da1d-43a8-9aa4-6c5f8959f37b // site2 a9e2c249-90b4-4770-9e99-9702d89f73b6 // replace null with your siteid and run the app, then change it back to null since it can only be a one time task string sId = null; CloudscribeIdentityServerIntegrationNoDbStorage.InitializeDatabaseAsync( services, sId, IdServerClients.Get(), IdServerResources.GetApiResources(), IdServerResources.GetIdentityResources() ).Wait(); break; case "ef": default: // this creates ensures the database is created and initial data CoreEFStartup.InitializeDatabaseAsync(services).Wait(); // this one is only needed if using cloudscribe Logging with EF as the logging storage LoggingEFStartup.InitializeDatabaseAsync(services).Wait(); KvpEFCoreStartup.InitializeDatabaseAsync(services).Wait(); // you can use this hack to add clients and scopes into the db during startup if needed // I used this before we implemented the UI for adding them // you should not use this on the first run that actually creates the initial cloudscribe data // you must wait until after that and then you can get the needed siteid from the database // this will only run at startup time and only add data if no data exists for the given site. // if you pass in an invalid siteid it will not fail, you will get data with a bad siteid // make note of your siteid, don't use these, these are from my db // site1 8f54733c-3f3a-4971-bb1f-8950cea42f1a // site2 7c111db3-e270-497a-9a12-aed436c764c6 // replace null with your siteid and run the app, then change it back to null since it can only be a one time task string siteId = null; CloudscribeIdentityServerIntegrationEFCoreStorage.InitializeDatabaseAsync( services, siteId, IdServerClients.Get(), IdServerResources.GetApiResources(), IdServerResources.GetIdentityResources() ).Wait(); break; } }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. // you can add things to this method signature and they will be injected as long as they were registered during // ConfigureServices public void Configure( IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IOptions <cloudscribe.Core.Models.MultiTenantOptions> multiTenantOptionsAccessor, IServiceProvider serviceProvider, IOptions <RequestLocalizationOptions> localizationOptionsAccessor , cloudscribe.Logging.Web.ILogRepository logRepo ) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); ConfigureLogging(loggerFactory, serviceProvider, logRepo); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); app.UseBrowserLink(); } var storage = Configuration["DevOptions:DbPlatform"]; switch (storage) { case "NoDb": CoreNoDbStartup.InitializeDataAsync(app.ApplicationServices).Wait(); // you can use this hack to add clients and scopes into the db since // there is currently no ui to do it // you should not use this on the first run that actually creates the initial cloudscribe data // you must wait until after that and then you can get the needed siteid from the database // this will only run at startup time and only add data if no data exists for the given site. // if you pass in an invalid siteid it will not fail, you will get data with a bad siteid // make note of your siteid, don't use these, these are from my NoDb storage // site1 05301194-da1d-43a8-9aa4-6c5f8959f37b // site2 a9e2c249-90b4-4770-9e99-9702d89f73b6 // replace null with your siteid and run the app, then change it back to null since it can only be a one time task string sId = null; CloudscribeIdentityServerIntegrationNoDbStorage.InitializeDatabaseAsync( app.ApplicationServices, sId, IdServerClients.Get(), IdServerResources.GetApiResources(), IdServerResources.GetIdentityResources() ).Wait(); break; case "ef": default: // this creates ensures the database is created and initial data CoreEFStartup.InitializeDatabaseAsync(app.ApplicationServices).Wait(); // this one is only needed if using cloudscribe Logging with EF as the logging storage LoggingEFStartup.InitializeDatabaseAsync(app.ApplicationServices).Wait(); // you can use this hack to add clients and scopes into the db since // there is currently no ui to do it // you should not use this on the first run that actually creates the initial cloudscribe data // you must wait until after that and then you can get the needed siteid from the database // this will only run at startup time and only add data if no data exists for the given site. // if you pass in an invalid siteid it will not fail, you will get data with a bad siteid // make note of your siteid, don't use these, these are from my db // site1 8f54733c-3f3a-4971-bb1f-8950cea42f1a // site2 7c111db3-e270-497a-9a12-aed436c764c6 // replace null with your siteid and run the app, then change it back to null since it can only be a one time task string siteId = null; CloudscribeIdentityServerIntegrationEFCoreStorage.InitializeDatabaseAsync( app.ApplicationServices, siteId, IdServerClients.Get(), IdServerResources.GetApiResources(), IdServerResources.GetIdentityResources() ).Wait(); break; } app.UseForwardedHeaders(); app.UseStaticFiles(); app.UseSession(); app.UseRequestLocalization(localizationOptionsAccessor.Value); app.UseMultitenancy <cloudscribe.Core.Models.SiteContext>(); var multiTenantOptions = multiTenantOptionsAccessor.Value; app.UsePerTenant <cloudscribe.Core.Models.SiteContext>((ctx, builder) => { // custom 404 and error page - this preserves the status code (ie 404) if (multiTenantOptions.Mode != cloudscribe.Core.Models.MultiTenantMode.FolderName || string.IsNullOrEmpty(ctx.Tenant.SiteFolderName)) { builder.UseStatusCodePagesWithReExecute("/Home/Error/{0}"); } else { builder.UseStatusCodePagesWithReExecute("/" + ctx.Tenant.SiteFolderName + "/Home/Error/{0}"); } builder.UseCloudscribeCoreDefaultAuthentication( loggerFactory, multiTenantOptions, ctx.Tenant); // to make this multi tenant for folders // using a fork of IdentityServer4 and hoping to get changes so we don't need a fork // https://github.com/IdentityServer/IdentityServer4/issues/19 builder.UseIdentityServer(); //// this sets up the authentication for apis within this application endpoint //// ie apis that are hosted in the same web app endpoint with the authority server //// this is not needed here if you are only using separate api endpoints //// it is needed in the startup of those separate endpoints //builder.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions //{ // Authority = "https://localhost:44399", // // using the site aliasid as the scope so each tenant has a different scope // // you can view the aliasid from site settings // // clients must be configured with the scope to have access to the apis for the tenant // ApiName = ctx.Tenant.AliasId, // RequireHttpsMetadata = true //}); }); UseMvc(app, multiTenantOptions.Mode == cloudscribe.Core.Models.MultiTenantMode.FolderName); }