protected void Application_Start() { AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter; var jSettings = new JsonSerializerSettings { Formatting = Formatting.Indented, DateTimeZoneHandling = DateTimeZoneHandling.Utc, ReferenceLoopHandling = ReferenceLoopHandling.Ignore, ContractResolver = new CamelCasePropertyNamesContractResolver() }; jsonFormatter.SerializerSettings = jSettings; //Start Background Services ServicesScheduler.Start(); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var connection = Configuration.GetConnectionString("DefaultConnection"); services.AddDbContext <ApplicationDbContext>( options => options.UseLazyLoadingProxies() .UseSqlServer(connection)); // configure token generation services.AddIdentity <User, Role>() .AddEntityFrameworkStores <ApplicationDbContext>() .AddDefaultTokenProviders(); services.Configure <IdentityOptions>(options => { // Password settings. options.Password = new PasswordOptions() { RequireDigit = bool.Parse(Configuration.GetSection("PasswordPolicies:RequireDigit").Value), RequiredLength = int.Parse(Configuration.GetSection("PasswordPolicies:MinimumLength").Value), RequireLowercase = bool.Parse(Configuration.GetSection("PasswordPolicies:RequireLowercase").Value), RequireUppercase = bool.Parse(Configuration.GetSection("PasswordPolicies:RequireUppercase").Value), RequireNonAlphanumeric = bool.Parse(Configuration.GetSection("PasswordPolicies:RequireNonLetterOrDigit").Value), RequiredUniqueChars = int.Parse(Configuration.GetSection("PasswordPolicies:RequiredUniqueChars").Value), }; // Lockout settings. options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(600); options.Lockout.MaxFailedAccessAttempts = 50; options.Lockout.AllowedForNewUsers = true; // User settings. options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._+?!@#$%^&*"; options.User.RequireUniqueEmail = false; }); services.AddCors(); services.AddAuthorization(); services.AddControllersWithViews(); services.AddRazorPages(); // Register the Swagger generator, defining 1 or more Swagger documents services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Net Core Starter", Version = "v1" }); }); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); // => remove default claims services .AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(cfg => { cfg.RequireHttpsMetadata = false; cfg.SaveToken = true; cfg.TokenValidationParameters = new TokenValidationParameters { ValidIssuer = Configuration["Tokens:Issuer"], ValidAudience = Configuration["Tokens:Issuer"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])), ClockSkew = TimeSpan.Zero // remove delay of token when expire }; }); services.AddMvc() .AddNewtonsoftJson(options => { options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; }); ///Start Background Services services.AddSingleton <MessageProcessService>(); var serviceProvider = services.BuildServiceProvider(); ServicesScheduler.StartAsync(serviceProvider).GetAwaiter(); }