Guest User

startup.cs

a guest
Aug 5th, 2018
230
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System.Globalization;
  2. using System.Text;
  3. using System.Threading.Tasks;
  4. using AutoMapper;
  5. using Microsoft.AspNetCore.Authentication.Cookies;
  6. using Microsoft.AspNetCore.Authorization;
  7. using Microsoft.AspNetCore.Builder;
  8. using Microsoft.AspNetCore.Cors.Infrastructure;
  9. using Microsoft.AspNetCore.Hosting;
  10. using Microsoft.AspNetCore.Identity;
  11. using Microsoft.AspNetCore.Localization;
  12. using Microsoft.AspNetCore.Mvc;
  13. using Microsoft.AspNetCore.Mvc.Razor;
  14. using Microsoft.Extensions.Configuration;
  15. using Microsoft.Extensions.DependencyInjection;
  16. using Microsoft.Extensions.Logging;
  17. using Microsoft.Extensions.Options;
  18. using Microsoft.IdentityModel.Tokens;
  19. using Newtonsoft.Json;
  20. using Newtonsoft.Json.Serialization;
  21. using SednaCloud.Data;
  22. using SednaCloud.Data.Models;
  23. using SednaCloud.API.Services;
  24. using SednaCloud.Data.Repository;
  25. using SednaCloud.Services;
  26. using Microsoft.AspNetCore.Authentication.JwtBearer;
  27. using Swashbuckle.AspNetCore.Swagger;
  28. using DevExpress.AspNetCore;
  29. using DevExpress.AspNetCore.Reporting;
  30. using SednaCloud.Data.Helper;
  31. using Microsoft.ApplicationInsights.Extensibility;
  32. using Microsoft.ApplicationInsights.DependencyCollector;
  33. using System.Linq;
  34. using System;
  35. using System.IO;
  36. using Microsoft.EntityFrameworkCore;
  37. using Microsoft.EntityFrameworkCore.Migrations;
  38. using ElectronNET.API;
  39. using ElectronNET.API.Entities;
  40. using Microsoft.AspNetCore.Rewrite;
  41. using System.Net;
  42. using Microsoft.AspNetCore.Http;
  43.  
  44. namespace SednaCloud.API
  45. {
  46.     public class Startup
  47.     {
  48.         public IConfigurationRoot _config { get; }
  49.         private IHostingEnvironment _env;
  50.         public Startup(IHostingEnvironment env)
  51.         {
  52.             var builder = new ConfigurationBuilder()
  53.                 .SetBasePath(env.ContentRootPath)
  54.                 .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
  55.                 .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
  56.             // .AddJsonFile("certificate.json", optional: true, reloadOnChange: true)
  57.             //   .AddJsonFile($"certificate.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true, reloadOnChange: true);
  58.  
  59.  
  60.  
  61.             if (env.IsEnvironment("Development"))
  62.             {
  63.                 // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
  64.                 builder.AddApplicationInsightsSettings(developerMode: true);
  65.             }
  66.  
  67.             builder.AddEnvironmentVariables();
  68.             _env = env;
  69.             _config = builder.Build();
  70.  
  71.             //var certificateSettings = _config.GetSection("certificateSettings");
  72.             //string certificateFileName = certificateSettings.GetValue<string>("filename");
  73.             //string certificatePassword = certificateSettings.GetValue<string>("password");
  74.  
  75.             //var certificate = new X509Certificate2(certificateFileName, certificatePassword);
  76.  
  77.         }
  78.  
  79.  
  80.         public void ConfigureServices(IServiceCollection services)
  81.         {
  82.             services.AddSingleton(_config);
  83.             services.AddTransient<AdminContextInitializer>();
  84.             services.AddTransient<AccountIdentityInitializer>();
  85.  
  86.  
  87.             services.AddSingleton(_config);
  88.             services.AddDbContext<AdminContext>(ServiceLifetime.Scoped);
  89.             services.AddDbContext<PortaleContext>(ServiceLifetime.Scoped);
  90.  
  91.             services.AddScoped<IListiniRepository, ListiniRepository>();
  92.             services.AddScoped<IImpostazioniFornitoriRepository, ImpostazioniFornitoriRepository>();
  93.             services.AddScoped<ICausaliContabiliRepository, CausaliContabiliRepository>();
  94.             services.AddScoped<IScadenziarioRepository, ScadenziarioRepository>();
  95.             services.AddScoped<IModalitaPagamentoRepository, ModalitaPagamentoRepository>();
  96.             services.AddScoped<ITenantRepository, TenantRepository>();
  97.             services.AddScoped<ILicenzeRepository, LicenzeRepository>();
  98.             services.AddScoped<IUtenteLicenzaRepository, UtenteLicenzaRepository>();
  99.             services.AddScoped(typeof(IRepositoryBase<>), typeof(RepositoryBase<>));
  100.             //services.AddScoped<IClientiRepository, ClientiRepository>();
  101.             services.AddScoped<IRicezioneMerceRepository, RicezioneMerceRepository>();
  102.             services.AddScoped<IMerceProduttoriRepository, MerceProduttoriRepository>();
  103.             services.AddScoped<IFornitoriRepository, FornitoriRepository>();
  104.             services.AddScoped<IRegistroIvaSezionaliRepository, RegistroIvaSezionaliRepository>();
  105.             services.AddScoped<ITestataDocumentoRepository, TestataDocumentoRepository>();
  106.             services.AddScoped<ITestataContabilitaRepository, TestataContabilitaRepository>();
  107.             services.AddScoped<IVenditaBancoRepository, VenditaBancoRepository>();
  108.             services.AddScoped<IFatturaElettronicaService, FatturaElettronicaService>();
  109.             //services.AddScoped<IArticoliGruppoRepository, ArticoliGruppoRepository>();
  110.             // services.AddScoped<IUserManagerRepository, UserManagerRepository>();
  111.             services.AddTransient<AdminContextInitializer>();
  112.             services.AddTransient<AccountIdentityInitializer>();
  113.  
  114.             services.AddTransient<IEmailSender, AuthMessageSender>();
  115.  
  116.             // Add framework services.
  117.             services.AddApplicationInsightsTelemetry(_config);
  118.  
  119.             // Multi-Tenant
  120.             services.AddMultitenancy<AppTenant, CachingAppTenantResolver>();
  121.  
  122.             services.AddAutoMapper();
  123.  
  124.             services.AddIdentity<ApplicationUser, IdentityRole>(config =>
  125.             {
  126.                 config.User.RequireUniqueEmail = true;
  127.                 config.Password.RequiredLength = 8;
  128.                 config.Password.RequireNonAlphanumeric = false;
  129.                 config.Password.RequireUppercase = false;
  130.                 // config.Cookies.ApplicationCookie.LoginPath = "/App/Login";
  131.                 config.SignIn.RequireConfirmedEmail = false;
  132.                 config.SignIn.RequireConfirmedPhoneNumber = false;
  133.             })
  134.             .AddEntityFrameworkStores<AdminContext>()
  135.             .AddEntityFrameworkStores<PortaleContext>()
  136.             .AddUserManager<ApplicationUserManager>()
  137.             .AddDefaultTokenProviders();
  138.  
  139.             //services.AddIdentity<ApplicationUser, IdentityRole>(config =>
  140.             // {
  141.             //     config.User.RequireUniqueEmail = true;
  142.             //     config.Password.RequiredLength = 8;
  143.             //     config.Password.RequireNonAlphanumeric = false;
  144.             //     config.Password.RequireUppercase = false;
  145.             //     // config.Cookies.ApplicationCookie.LoginPath = "/App/Login";
  146.             //     config.SignIn.RequireConfirmedEmail = false;
  147.             //     config.SignIn.RequireConfirmedPhoneNumber = false;
  148.             // })
  149.             //.AddEntityFrameworkStores<PortaleContext>()
  150.             //.AddUserManager<ApplicationUserManager>()
  151.             //.AddDefaultTokenProviders();
  152.  
  153.             //services.Configure<IdentityOptions>(config =>
  154.             //{
  155.             //    config.Cookies.ApplicationCookie.Events =
  156.             //      new CookieAuthenticationEvents()
  157.             //      {
  158.             //          OnRedirectToLogin = (ctx) =>
  159.             //          {
  160.             //              if (ctx.Request.Path.StartsWithSegments("/api") && ctx.Response.StatusCode == 200)
  161.             //              {
  162.             //                  ctx.Response.StatusCode = 401;
  163.             //              }
  164.  
  165.             //              return Task.CompletedTask;
  166.             //          },
  167.             //          OnRedirectToAccessDenied = (ctx) =>
  168.             //          {
  169.             //              if (ctx.Request.Path.StartsWithSegments("/api") && ctx.Response.StatusCode == 200)
  170.             //              {
  171.             //                  ctx.Response.StatusCode = 403;
  172.             //              }
  173.  
  174.             //              return Task.CompletedTask;
  175.             //          }
  176.             //      };
  177.             //});
  178.             services.AddApiVersioning(cfg =>
  179.             {
  180.                 cfg.DefaultApiVersion = new ApiVersion(1, 0);
  181.                 cfg.AssumeDefaultVersionWhenUnspecified = true;
  182.                 cfg.ReportApiVersions = true;
  183.                 //var rdr = new QueryStringOrHeaderApiVersionReader("ver");
  184.                 //rdr.HeaderNames.Add("X-SednaCloud-Version");
  185.                 //cfg.ApiVersionReader = rdr;
  186.  
  187.                 //cfg.Conventions.Controller<TalksController>()
  188.                 //  .HasApiVersion(new ApiVersion(1, 0))
  189.                 //  .HasApiVersion(new ApiVersion(1, 1))
  190.                 //  .HasApiVersion(new ApiVersion(2, 0))
  191.                 //  .Action(m => m.Post(default(string), default(int), default(TalkModel)))
  192.                 //    .MapToApiVersion(new ApiVersion(1, 1));
  193.             });
  194.             services.Add(ServiceDescriptor.Transient<ICorsService, WildCardCorsService>());
  195.  
  196.             services.AddCors(cfg =>
  197.             {
  198.                 // Func<string, bool> func = x => x.Contains(".mysedna.com");
  199.  
  200.                 cfg.AddPolicy("SednaCloud", bldr =>
  201.                 {
  202.                     // bldr.SetIsOriginAllowedToAllowWildcardSubdomains()
  203.                     bldr.AllowAnyHeader()
  204.                         .AllowAnyMethod()
  205.                        // .AllowAnyOrigin();
  206.                        //.SetIsOriginAllowed(func)
  207.                        //.SetIsOriginAllowedToAllowWildcardSubdomains()
  208.                        .WithOrigins(
  209.                        "http://*.mysedna.com",
  210.                        "http://www.apimysedna.com",
  211.                        "http://apimysedna.com",
  212.                        "http://www.mysedna.com",
  213.                        "http://mysedna.com",
  214.                        "http://localhost:4200",
  215.                        "http://5.249.137.216:8091");
  216.                 });
  217.  
  218.                 cfg.AddPolicy("AnyGET", bldr =>
  219.                 {
  220.                     bldr.AllowAnyHeader()
  221.                         .WithMethods("GET")
  222.                         .AllowAnyOrigin();
  223.                 });
  224.                 cfg.AddPolicy("AnyOrigin", builder =>
  225.                 {
  226.                     builder
  227.                         .AllowAnyOrigin()
  228.                         .AllowAnyMethod();
  229.                 });
  230.  
  231.             });
  232.  
  233.             services.AddAuthorization(cfg =>
  234.             {
  235.                 cfg.AddPolicy("SuperUsers", p => p.RequireClaim("SuperUser", "True"));
  236.                 cfg.AddPolicy("Admin", p => p.RequireClaim("Admin", "True"));
  237.                 cfg.AddPolicy("CanAccessTenant", p => p.AddRequirements(new IsTenantRequirement()));
  238.                 cfg.AddPolicy("AccessOnlyAdminDb", p => p.AddRequirements(new OnlyAdminTenantRequirement()));
  239.                 cfg.AddPolicy("AccessOnlySednaUsers", p => p.AddRequirements(new OnlySednaUsersRequirement()));
  240.             });
  241.  
  242.             services.AddScoped<IAuthorizationHandler, HasTenantAuthorizationHandler>();
  243.             services.AddScoped<IAuthorizationHandler, OnlyTenantAdminDbHandler>();
  244.             services.AddScoped<IAuthorizationHandler, OnlySednaUsersHandler>();
  245.  
  246.  
  247.             services.AddDevExpressControls();
  248.  
  249.  
  250.             /* services.AddDbContext<AdminContext>(options =>
  251.                   options.UseMySql("server = localhost; uid = root; pwd = Pippo1211; database = SednaCloud.AdminDb;")
  252.              );
  253.  
  254.              services.AddDbContext<PortaleContext>(options =>
  255.              options.UseMySql("server = localhost; uid = root; pwd = Pippo1211; database = SednaCloud.test10;")
  256.              );*/
  257.  
  258.             /* services.AddScoped<IMigrationsSqlGenerator, CustomMySqlMigrationsSqlGenerator>();
  259.  
  260.              services.AddEntityFrameworkMySql().AddDbContext<PortaleContext>((sp,options) =>
  261.                     options.UseInternalServiceProvider(sp)
  262.                 );
  263.              */
  264.  
  265.  
  266.  
  267.  
  268.             services.AddHsts(options =>
  269.             {
  270.                 options.MaxAge = TimeSpan.FromDays(100);
  271.                 options.IncludeSubDomains = true;
  272.                 options.Preload = true;
  273.             });
  274.  
  275.             services.AddHttpsRedirection(options => { });
  276.  
  277.  
  278.             services.AddMvc(opts =>
  279.             {
  280.  
  281.                 // opts.Filters.Add(new CorsAuthorizationFilterFactory("SednaCloud"));
  282.                 //  opts.Conventions.Insert(0, new ApiPrefixConvention());
  283.                 //if (!_env.IsProduction())
  284.                 //{
  285.                 //    opts.SslPort = 44388;
  286.                 //}
  287.                 //  opts.Filters.Add(new RequireHttpsAttribute());
  288.             }).AddJsonOptions(o =>
  289.             {
  290.                 if (o.SerializerSettings.ContractResolver != null)
  291.                 {
  292.                     var castedResolver = o.SerializerSettings.ContractResolver as DefaultContractResolver;
  293.                     castedResolver.NamingStrategy = new CamelCaseNamingStrategy();
  294.                 }
  295.                 o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
  296.             })
  297.             .AddViewLocalization(
  298.                     LanguageViewLocationExpanderFormat.Suffix,
  299.                     opts => {
  300.                         opts.ResourcesPath = "Resources";
  301.                     })
  302.             .AddDataAnnotationsLocalization(options =>
  303.             {
  304.                 options.DataAnnotationLocalizerProvider = (type, factory) =>
  305.                     factory.Create(typeof(SharedResource));
  306.             }).AddDefaultReportingControllers();
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.             services.ConfigureReportingServices(configurator => {
  314.                 configurator.ConfigureReportDesigner(designerConfigurator => {
  315.                     designerConfigurator.RegisterDataSourceWizardConfigFileConnectionStringsProvider();
  316.                 });
  317.             });
  318.  
  319.  
  320.  
  321.  
  322.             // Register the Swagger generator, defining one or more Swagger documents
  323.             services.AddSwaggerGen(c =>
  324.             {
  325.                 c.SwaggerDoc("v1", new Info { Title = "MySedna API", Version = "v1" });
  326.             });
  327.  
  328.             services.Configure<RequestLocalizationOptions>(
  329.                 opts =>
  330.                 {
  331.                     var supportedCultures = new[]
  332.                     {
  333.                                         new CultureInfo("it-IT"),
  334.                                         new CultureInfo("en-US"),
  335.                                         new CultureInfo("fr-FR"),
  336.                                         new CultureInfo("es-ES")
  337.                         };
  338.  
  339.                     opts.DefaultRequestCulture = new RequestCulture("it-IT", "it-IT");
  340.                     // Formatting numbers, dates, etc.
  341.                     opts.SupportedCultures = supportedCultures;
  342.                     // UI strings that we have localized.
  343.                     opts.SupportedUICultures = supportedCultures;
  344.  
  345.                     opts.RequestCultureProviders.Insert(0, new UrlRequestCultureProvider());
  346.                 });
  347.  
  348.  
  349.             services.AddAuthentication(o =>
  350.             {
  351.                 o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
  352.                 o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  353.                 o.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;
  354.             })
  355.             .AddCookie(o => o.Events =
  356.               new CookieAuthenticationEvents()
  357.               {
  358.                   OnRedirectToLogin = (ctx) =>
  359.                   {
  360.                       if (ctx.Request.Path.StartsWithSegments("/api") && ctx.Response.StatusCode == 200)
  361.                       {
  362.                           ctx.Response.StatusCode = 401;
  363.                       }
  364.  
  365.                       return Task.CompletedTask;
  366.                   },
  367.                   OnRedirectToAccessDenied = (ctx) =>
  368.                   {
  369.                       if (ctx.Request.Path.StartsWithSegments("/api") && ctx.Response.StatusCode == 200)
  370.                       {
  371.                           ctx.Response.StatusCode = 403;
  372.                       }
  373.  
  374.                       return Task.CompletedTask;
  375.                   }
  376.               })
  377.             .AddJwtBearer(cfg =>
  378.             {
  379.                 cfg.SaveToken = true;
  380.                     // AutomaticAuthenticate = true,
  381.                     // AutomaticChallenge = true,
  382.                     cfg.TokenValidationParameters = new TokenValidationParameters()
  383.                 {
  384.                     ValidIssuer = _config["Tokens:Issuer"],
  385.                     ValidAudience = _config["Tokens:Audience"],
  386.                     ValidateIssuerSigningKey = true,
  387.                     IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"])),
  388.                     ValidateLifetime = true
  389.                 };
  390.             });
  391.  
  392.             DisableCorrelationIdHeaders(services);
  393.  
  394.  
  395.  
  396.         }
  397.         private void DisableCorrelationIdHeaders(IServiceCollection services)
  398.         {
  399.             var module = services.FirstOrDefault(t => t.ImplementationFactory?.GetType() == typeof(Func<IServiceProvider, DependencyTrackingTelemetryModule>));
  400.             if (module != null)
  401.             {
  402.                 services.Remove(module);
  403.                 services.AddSingleton<ITelemetryModule>(provider => new DependencyTrackingTelemetryModule { SetComponentCorrelationHttpHeaders = false });
  404.             }
  405.         }
  406.  
  407.  
  408.         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline
  409.         public void Configure(IApplicationBuilder app,
  410.             IHostingEnvironment env,
  411.             ILoggerFactory loggerFactory,
  412.             AdminContextInitializer seeder,
  413.             AccountIdentityInitializer identitySeeder)
  414.         {
  415.             if (env.IsDevelopment())
  416.             {
  417.                 app.UseDeveloperExceptionPage();
  418.             }
  419.             else
  420.             {
  421.                 app.UseExceptionHandler("/Error");
  422.                 app.UseHsts();
  423.             }
  424.             var reportStorageFileDirectoryPath = Path.Combine(env.ContentRootPath, @"Reports\ReportBase");
  425.             DevExpress.XtraReports.Web.Extensions.ReportStorageWebExtension.RegisterExtensionGlobal(new ReportStorageWebExtension1(env,reportStorageFileDirectoryPath));
  426.             DevExpress.XtraReports.Configuration.Settings.Default.UserDesignerOptions.DataBindingMode = DevExpress.XtraReports.UI.DataBindingMode.Expressions;
  427.             loggerFactory.AddConsole(_config.GetSection("Logging"));
  428.             loggerFactory.AddDebug();
  429.  
  430.           //  app.UseDeveloperExceptionPage();
  431.  
  432.  
  433.             app.UseMultitenancy<AppTenant>();
  434.             app.UseAuthentication();
  435.  
  436.             app.UseRequestLocalization(app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value);
  437.             app.UseCors("SednaCloud");
  438.  
  439.  
  440.             app.UseSwagger();
  441.             app.UseSwaggerUI(c =>
  442.             {
  443.                 c.SwaggerEndpoint("/swagger/v1/swagger.json", "MySedna API V1");
  444.             });
  445.  
  446.             app.Use(async (context, next) =>
  447.             {
  448.                 await next();
  449.                 if (context.Response.StatusCode == 404 && !Path.HasExtension(context.Request.Path.Value))
  450.                 {
  451.                     context.Request.Path = "/index.html";
  452.                     await next();
  453.                 }
  454.             });
  455.  
  456.  
  457.             app.UseHttpsRedirection();
  458.             //app.UseHttpsRedirection();
  459.             /* var options = new RewriteOptions()
  460.                    .AddRedirectToHttpsPermanent();
  461.  
  462.               app.UseRewriter(options);*/
  463.  
  464.             /*  app.UseRewriter(new RewriteOptions()
  465.                    .AddRedirectToHttps()
  466.                    .AddRedirect(@"^section1/(.*)", "new/$1", (int)HttpStatusCode.Redirect)
  467.                    .AddRedirect(@"^section2/(\\d+)/(.*)", "new/$1/$2", (int)HttpStatusCode.MovedPermanently)
  468.                    .AddRewrite("^feed$", "/?format=rss", skipRemainingRules: false));*/
  469.  
  470.             app.UseDefaultFiles();
  471.  
  472.             app.UseStaticFiles();
  473.  
  474.             app.UseDevExpressControls();
  475.  
  476.  
  477.            
  478.  
  479.             //  app.UseMvc();
  480.             app.UseMvc(routes =>
  481.             {
  482.               /*  routes.MapRoute(
  483.                     name: "default",
  484.                     template: "api/{controller=ReportApi}/{action=Index}/{id?}");*/
  485.                 routes.MapRoute(
  486.                     name: "default",
  487.                     template: "{controller=Home}/{action=Index}/{id?}");
  488.  
  489.  
  490.             });
  491.  
  492.  
  493.             seeder.Seed().Wait();
  494.             identitySeeder.Seed().Wait();
  495.  
  496.  
  497.  
  498.  
  499.             if (HybridSupport.IsElectronActive)
  500.             {
  501.                 ElectronBootstrap();
  502.             }
  503.  
  504.    
  505.  
  506.         }
  507.  
  508.         public async void ElectronBootstrap()
  509.         {
  510.             var browserWindow = await Electron.WindowManager.CreateWindowAsync(new BrowserWindowOptions
  511.             {
  512.                 Width = 1152,
  513.                 Height = 864,
  514.                 Show = false,
  515.                 WebPreferences = new WebPreferences
  516.                 {
  517.                     WebSecurity = false
  518.                 },
  519.             });
  520.  
  521.             browserWindow.OnReadyToShow += () => browserWindow.Show();
  522.             browserWindow.SetTitle("Electron.NET API Demos");
  523.         }
  524.     }
  525. }
RAW Paste Data