Exemplo n.º 1
0
        public static IServiceCollection ConfigureFrameworkOptions(this IServiceCollection services,
                                                                   FrameworkOptionsConfigurator configurator)
        {
            var original = configurator.Build();

            return(services.Configure <FrameworkOptions>(opt => opt.CopyFrom(original)));
        }
Exemplo n.º 2
0
        // 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
        }