public static IServiceCollection ConfigureFrameworkOptions(this IServiceCollection services, FrameworkOptionsConfigurator configurator) { var original = configurator.Build(); return(services.Configure <FrameworkOptions>(opt => opt.CopyFrom(original))); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { #region Common _tempAssemblyList = ReflectionHelper.GetAllAssemblies( excludedRelativeDirPaths: WebApiConsts.ExcludedAssemblyDirs); #endregion #region Framework options var fwOptionsConfigurator = new FrameworkOptionsConfigurator(); fwOptionsConfigurator.ScanShouldSkipFilterTypes( typeof(Startup).Assembly, new[] { typeof(BaseApiController).Namespace }); #endregion #region Services ISecretsManager secretsManager; services.AddDefaultSecretsManager(_env, Configuration, ConfigConsts.CommandLine.WindowsCmd, out secretsManager) .AddAppDbContext(secretsManager) .Configure <ApiBehaviorOptions>(options => { options.SuppressModelStateInvalidFilter = true; }) .AddHttpContextAccessor() .AddHttpBusinessContextProvider() .AddHttpUnitOfWorkProvider() .ScanServices(_tempAssemblyList) .AddDefaultDbMigrator() .AddDefaultDateTimeModelBinder() .AddRequestFeatureMiddleware() .AddRequestTimeZoneMiddleware() .AddDefaultValidationResultProvider() .AddSmtpService(opt => { _smtpOptionSection.Bind(opt); opt.Password = secretsManager.Get(ConfigConsts.Mail.PasswordKey); }) .AddJsonConfigurationManager(_defaultJsonFile, _envJsonFile) .ConfigureAppOptions(Configuration) .Configure <RequestLocalizationOptions>(options => { var supportedCultures = Settings.App.SupportedCultureNames.ToArray(); options.SetDefaultCulture(supportedCultures[0]) .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); options.FallBackToParentCultures = true; options.FallBackToParentUICultures = true; //options.RequestCultureProviders = ... }) .ConfigureAppRequestTimeZone() .ConfigureGlobalQueryFilter(new[] { typeof(DataContext).Assembly }) .ConfigureFrameworkOptions(fwOptionsConfigurator); #endregion #region Authentication services.AddIdentityCore <AppUser>(options => { options.SignIn.RequireConfirmedEmail = false; }).AddRoles <AppRole>() .AddDefaultTokenProviders() .AddSignInManager() .AddEntityFrameworkStores <DataContext>(); services.Configure <IdentityOptions>(options => { options.Password.RequireDigit = false; options.Password.RequireLowercase = false; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.Password.RequiredLength = 6; options.Password.RequiredUniqueChars = 0; options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); options.Lockout.MaxFailedAccessAttempts = 5; options.Lockout.AllowedForNewUsers = true; options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+"; options.User.RequireUniqueEmail = false; }); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(jwtBearerOptions => { jwtBearerOptions.TokenValidationParameters = SecurityConsts.DefaultTokenParameters; //jwtBearerOptions.Events = new JwtBearerEvents //{ // OnMessageReceived = (context) => // { // StringValues values; // if (!context.Request.Query.TryGetValue("access_token", out values)) // return Task.CompletedTask; // var token = values.FirstOrDefault(); // context.Token = token; // return Task.CompletedTask; // } //}; }); #endregion #region Authorization services.AddAppAuthorization(); #endregion #region Mvc, Controllers, i18n services.AddLocalization(options => options.ResourcesPath = "Resources"); services.AddControllers(options => { options.ModelBinderProviders.Insert(0, new QueryObjectModelBinderProvider()); options.Filters.Add <AutoValidateActionFilter>(); }).AddNewtonsoftJson() .AddDefaultFluentValidation(new[] { typeof(Cross.AssemblyModel).Assembly }) .AddViewLocalization(options => { //options.ResourcesPath = "..."; }) .AddDataAnnotationsLocalization(options => { //options.DataAnnotationLocalizerProvider = (type, factory) => // factory.Create(typeof(SharedResource)); }); #endregion #region Swagger services.AddSwaggerGenNewtonsoftSupport(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "My API", Description = "A simple example ASP.NET Core Web API", TermsOfService = new Uri("https://example.com/terms"), }); c.OperationFilter <SwaggerSecurityOperationFilter>(); if (Settings.App.Swagger.AddSwaggerAcceptLanguageHeader) { c.OperationFilter <SwaggerGlobalHeaderOperationFilter>(); } if (Settings.App.Swagger.AddSwaggerTimeZoneHeader) { c.OperationFilter <SwaggerTimeZoneHeaderOperationFilter>(); } c.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme, new OpenApiSecurityScheme { In = ParameterLocation.Header, Description = "Please enter into field the word 'Bearer' following by space and JWT", Name = "Authorization", Type = SecuritySchemeType.ApiKey }); var requirement = new OpenApiSecurityRequirement(); requirement[new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = JwtBearerDefaults.AuthenticationScheme } }] = Array.Empty <string>(); c.AddSecurityRequirement(requirement); var filePath = Path.Combine(System.AppContext.BaseDirectory, $"{typeof(Startup).Assembly.GetName().Name}.xml"); c.IncludeXmlComments(filePath); }); #endregion }