示例#1
0
        /// <summary>
        /// 使用 Redis 缓存服务(将以 Redis 缓存实现 <see cref="ICacheManager"/> 接口,默认连接配置节为 Schubert:Redis。)。
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="setup"> Redis 缓存的配置安装方法。</param>
        /// <returns></returns>
        public static SchubertServicesBuilder AddRedisCache(this SchubertServicesBuilder builder, Action <SchubertRedisOptions> setup = null)
        {
            var configuration = builder.Configuration.GetSection("Schubert:Redis") as IConfiguration ?? new ConfigurationBuilder().Build();

            builder.ServiceCollection.Configure <SchubertRedisOptions>(configuration);

            SchubertRedisOptions options = new SchubertRedisOptions();
            var redisSetup = new ConfigureFromConfigurationOptions <SchubertRedisOptions>(configuration);

            redisSetup.Configure(options);
            if (setup != null)
            {
                setup(options);
                builder.ServiceCollection.Configure(setup);
            }

            builder.ServiceCollection.AddSmart(ServiceDescriber.Singleton <ICacheManager, RedisCacheManager>(SmartOptions.Replace));
            if (builder.AddedModules.Add(_module))
            {
                builder.ServiceCollection.AddSmart(ServiceDescriber.Singleton <IRedisCacheSerializer, JsonNetSerializer>(SmartOptions.Append));
            }

            if (options.ConnectionString.IsNullOrWhiteSpace())
            {
                throw new SchubertException("必须为 RedisCacheManager 指定连接字符串,可以通过 Schubert:Redis:ConnectionString 配置节配置。");
            }

            return(builder);
        }
示例#2
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            var signingConfiguration = new SigningConfiguration();

            services.AddSingleton(signingConfiguration);

            var tokenConfiguration = new TokenConfiguration();
            var cfco = new ConfigureFromConfigurationOptions <TokenConfiguration>(Configuration.GetSection("TokenConfiguration"));

            cfco.Configure(tokenConfiguration);

            services.AddSingleton(tokenConfiguration);


            services.AddAuthentication(authOptions =>
            {
                authOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                authOptions.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(bearerOptions =>
            {
                var paramsValidation = bearerOptions.TokenValidationParameters;
                paramsValidation.IssuerSigningKey = signingConfiguration.Key;
                paramsValidation.ValidAudience    = tokenConfiguration.Audience;
                paramsValidation.ValidIssuer      = tokenConfiguration.Issuer;

                // Valida a assinatura de um token recebido
                paramsValidation.ValidateIssuerSigningKey = true;

                // Verifica se um token recebido ainda é válido
                paramsValidation.ValidateLifetime = true;

                // Tempo de tolerância para a expiração de um token (utilizado
                // caso haja problemas de sincronismo de horário entre diferentes
                // computadores envolvidos no processo de comunicação)
                paramsValidation.ClockSkew = TimeSpan.Zero;
            });


            // Ativa o uso do token como forma de autorizar o acesso a recursos deste projeto
            services.AddAuthorization(auth =>
            {
                auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
                               .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
                               .RequireAuthenticatedUser().Build());
            });

            // Add service and create Policy with options
            services.AddCors(options =>
            {
                options.AddPolicy("CorsPolicy",
                                  builder => builder.AllowAnyOrigin()
                                  .AllowAnyMethod()
                                  .AllowAnyHeader()
                                  .AllowCredentials());
            });



            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }
示例#3
0
        /// <summary>
        /// 添加以 Dapper 作为持久化的数据层特性。
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="setup"></param>
        /// <returns></returns>
        public static SchubertServicesBuilder AddDapperDataFeature(this SchubertServicesBuilder builder, Action <DapperDataFeatureBuilder> setup = null)
        {
            DapperDatabaseOptions dbOptions = new DapperDatabaseOptions();

            if (builder.AddedModules.Add(_module))
            {
                //修改dapper的默认映射规则,让其支持下划线列名到C#实体驼峰命名属性
                Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;

                var configuration = builder.Configuration.GetSection("Schubert:Data") as IConfiguration ?? new ConfigurationBuilder().Build();

                builder.ServiceCollection.Configure <DapperDatabaseOptions>(configuration);

                var schubertDataSetup = new ConfigureFromConfigurationOptions <DapperDatabaseOptions>(configuration);
                schubertDataSetup.Configure(dbOptions);
            }

            DapperDataFeatureBuilder featureBuilder = new DapperDataFeatureBuilder(dbOptions);

            setup?.Invoke(featureBuilder);


            featureBuilder.Build();
            builder.ServiceCollection.Configure(featureBuilder.Configure);

            builder.ServiceCollection.AddSmart(DapperServices.GetServices(dbOptions));
            return(builder);
        }
示例#4
0
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterModule(new BackofficeModule(_configuration, _services, _loggerFactory));

            builder
            .RegisterInstance(_configuration)
            .As <IConfiguration>()
            .SingleInstance();

            var ftpOptions = new ConfigureFromConfigurationOptions <FtpConfiguration>(_configuration.GetSection(FtpConfiguration.SectionName));

            builder
            .RegisterInstance <IConfigureOptions <FtpConfiguration> >(ftpOptions)
            .SingleInstance();

            builder
            .RegisterType <UploadService>()
            .SingleInstance();

            builder
            .RegisterType <FtpConnection>()
            .As <IFtpConnection>();

            builder
            .RegisterType <OrafinFormatter>()
            .As <IOrafinFormatter>();

            builder
            .RegisterType <PublicServiceRepository>()
            .As <IPublicServiceRepository>();

            builder.Populate(_services);
        }
        public static SchubertServicesBuilder AddEntityFrameworkFeature(this SchubertServicesBuilder builder, Action <DbBuilder> setup = null)
        {
            DbOptions options = new DbOptions();

            if (builder.AddedModules.Add(_module))
            {
                var configuration = builder.Configuration.GetSection("Schubert:Data") as IConfiguration ?? new ConfigurationBuilder().Build();
                builder.ServiceCollection.Configure <DbOptions>(configuration);

                var schubertDataSetup = new ConfigureFromConfigurationOptions <DbOptions>(configuration);
                schubertDataSetup.Configure(options);
            }


            DbBuilder dbBuilder = new DbBuilder();

            if (setup != null)
            {
                setup(dbBuilder);
                if (dbBuilder.Setup != null)
                {
                    dbBuilder.Setup(options);
                    builder.ServiceCollection.Configure(dbBuilder.Setup);
                }
            }

            options.DbContextSettings = dbBuilder.DbSettings;
            builder.ServiceCollection.Configure <DbOptions>(dbOp =>
            {
                dbOp.DbContextSettings.AddRange(dbBuilder.DbSettings, true);
            });
            _dbConnectionMappings.AddRange(dbBuilder.DbContexts, true);

            if (dbBuilder.ShellDbAdded)
            {
                builder.ServiceCollection.AddSmart(ServiceDescriber.Scoped <IRepository <ShellDescriptorRecord>, Repository <ShellDescriptorRecord, ShellDescriptorDbContext> >());
                builder.ServiceCollection.AddSmart(ServiceDescriber.Scoped <IRepository <SettingRecord>, Repository <SettingRecord, ShellDescriptorDbContext> >());
                builder.ServiceCollection.AddSmart(ServiceDescriber.Scoped <IShellDescriptorManager, ShellDescriptorManager>());
            }

            builder.ServiceCollection.AddSmart(EntityFrameworkServices.GetServices(options));


            foreach (var action in dbBuilder.DbConfigurings.Values)
            {
                action(builder.ServiceCollection);
            }

            builder.ServiceCollection.AddSmart(ServiceDescriber.Scoped(
                                                   s =>
            {
                IOptions <DbOptions> dbOps = s.GetRequiredService <IOptions <DbOptions> >();
                return(new DbContextResources(s, dbBuilder.DefaultDbConnectionName, _dbConnectionMappings));
            },
                                                   SmartOptions.Replace));

            builder.ServiceCollection.TryAddScoped <IDatabaseContext>(s => s.GetRequiredService <DbContextResources>());

            return(builder);
        }
示例#6
0
        /// <summary>
        /// 应用配置中心中存储的配置。
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="configBasePath">配置中心配置文件的基目录</param>
        /// <param name="serverConfigFile">配置中心服务器配置文件。</param>
        /// <returns></returns>
        public static IConfigurationBuilder AddConfigurationCenter(this IConfigurationBuilder builder, string configBasePath, string serverConfigFile = "appsettings.json")
        {
            //如果使用ConfigurationBuilder则无法使用链式调用
            Guard.ArgumentNullOrWhiteSpaceString(serverConfigFile, nameof(serverConfigFile));

            var tempBuilder = new ConfigurationBuilder();

            tempBuilder
            .SetBasePath(configBasePath)
            .AddEnvironmentVariables()
            .AddJsonFile(serverConfigFile, false);

            IConfiguration configuration = tempBuilder.Build().GetSection("Schubert:Configuration") as IConfiguration ?? new ConfigurationBuilder().Build();

            if (configuration != null)
            {
                ConfigurationCenterOptions ccOptions = new ConfigurationCenterOptions();
                var serverOptionsSetup = new ConfigureFromConfigurationOptions <ConfigurationCenterOptions>(configuration);
                serverOptionsSetup.Configure(ccOptions);

                builder.Add(new ZookeeperConfigurationSource(ccOptions));
            }
            else
            {
                throw new ConfigurationException($"配置中心服务器配置文件格式不正确,缺少必要的配置节 Schubert:Configuration。");
            }
            return(builder);
        }
示例#7
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            #region Obtendo as configurações do projeto
            AppSettings appSettings = new AppSettings();
            //Responsável pela deserialização do appsettings.json
            var config =
                new ConfigureFromConfigurationOptions <object>(Configuration
                                                               .GetSection("AppSettings")); // config está apontando para o objeto appsettings
            config.Configure(appSettings);                                                  //deserializa o json e manda para AppSettings
            //injeção de dependencia
            services
            .AddSingleton <AppSettings>(appSettings);
            System.Environment.SetEnvironmentVariable("MYSQLSTRCON",
                                                      appSettings.StringConexaoMySql);
            //significa que tenho um objeto único, adicionando-o na memória
            #endregion


            #region Serviço para Cookie Auhtorization

            services.AddAuthentication(option =>
            {
                option.DefaultAuthenticateScheme =
                    CookieAuthenticationDefaults.AuthenticationScheme;

                option.DefaultChallengeScheme =
                    CookieAuthenticationDefaults.AuthenticationScheme;

                option.DefaultSignInScheme =
                    CookieAuthenticationDefaults.AuthenticationScheme;
            }).AddCookie(option =>
            {
                option.Cookie.Name      = "CookieAuth";
                option.AccessDeniedPath = //se for negado o acesso, redirecione para
                                          new Microsoft.AspNetCore.Http.PathString("/Home/Index");
                option.LoginPath =
                    new Microsoft.AspNetCore.Http.PathString("/Login/Index");
                option.ExpireTimeSpan =
                    TimeSpan.FromDays(appSettings.CookieTempoVida);
            });

            //abra um serviço no servidor para verificar se o usuário está autenticado
            services.AddAuthorization(option => {
                option.AddPolicy("CookieAuth", //aciono este cara para realizar as verificações
                                 new AuthorizationPolicyBuilder()
                                 .AddAuthenticationSchemes
                                     (CookieAuthenticationDefaults.AuthenticationScheme)
                                 .RequireAuthenticatedUser().Build()
                                 );
            });



            #endregion

            services.AddControllersWithViews().AddRazorRuntimeCompilation();

            services.AddHttpContextAccessor();
            services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
        }
        public static ConfiguracaoDoToken LerConfiguracaoDoToken(this IConfiguration configuration)
        {
            var sessao       = configuration.GetSection("TokenConfigurations");
            var configurador = new ConfigureFromConfigurationOptions <ConfiguracaoDoToken>(sessao);
            var configuracao = new ConfiguracaoDoToken();

            configurador.Configure(configuracao);
            return(configuracao);
        }
示例#9
0
        public static Options Parse(string[] args)
        {
            var builder = new ConfigurationBuilder()
                          .AddCommandLine(args, _commandMapping);

            var configure = new ConfigureFromConfigurationOptions <Options>(builder.Build());
            var options   = new Options();

            configure.Action(options);
            return(options);
        }
示例#10
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            #region Obtendo as configurações do projeto
            AppSettings appSettings = new AppSettings();
            //responsavel pela deserializanção do appsettings.json
            var config = new ConfigureFromConfigurationOptions <object>
                             (Configuration.GetSection("AppSettings"));
            config.Action(appSettings);

            services.AddSingleton <AppSettings>(appSettings);

            //variavel global para string de conexao
            System.Environment.SetEnvironmentVariable("MYSQLSTRCON", appSettings.StringConexaoMysql);

            #endregion

            #region Serviço para Cookie Authorization

            services.AddAuthentication(option =>
            {
                option.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                option.DefaultChallengeScheme    = CookieAuthenticationDefaults.AuthenticationScheme;
                option.DefaultSignInScheme       = CookieAuthenticationDefaults.AuthenticationScheme;
            }).AddCookie(option =>
            {
                option.Cookie.Name      = "CookieAutenticacao";
                option.AccessDeniedPath = new Microsoft.AspNetCore.Http.PathString("/Default/Index");
                option.LoginPath        = new Microsoft.AspNetCore.Http.PathString("/Default/Index");
                option.ExpireTimeSpan   = TimeSpan.FromDays(appSettings.CookieTempoVida);
            });

            services.AddAuthorization(option =>
            {
                option.AddPolicy("CookieAutenticacao", new AuthorizationPolicyBuilder()
                                 .AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme)
                                 .RequireAuthenticatedUser().Build());
            });

            #endregion

            services.Configure <CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded    = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });


            services.AddControllersWithViews();

            services.AddHttpContextAccessor();
            services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
        }
示例#11
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            #region Serviço de configuração da aplicação.
            var appSettings     = new AppSettings();
            var cfcoAppSettings = new ConfigureFromConfigurationOptions <AppSettings>(Configuration.GetSection("AppSettings"));
            cfcoAppSettings.Configure(appSettings);
            services.AddSingleton <AppSettings>(appSettings);
            #endregion

            services.AddTransient <Service.ProdutoService>();

            var client   = new MongoClient(appSettings.ConnectionString);
            var database = client.GetDatabase(appSettings.DatabaseName);
            services.AddSingleton <MongoClient>(client);
            services.AddSingleton <IMongoDatabase>(database);


            #region Configurando como o token será validado

            var signingConfiguration = new SigningConfiguration(appSettings.Key);
            services.AddSingleton(signingConfiguration);


            services.AddAuthentication(authOpt =>
            {
                authOpt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                authOpt.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(bearer =>
            {
                var validation                      = bearer.TokenValidationParameters;
                validation.ValidAudience            = appSettings.Audencie;
                validation.ValidIssuer              = appSettings.Issuer;
                validation.ValidateLifetime         = true;
                validation.ValidateIssuerSigningKey = true;
                validation.IssuerSigningKey         = signingConfiguration.Key;
            });

            //policial
            services.AddAuthorization(opt =>
            {
                opt.AddPolicy("ValidaUsuario", new AuthorizationPolicyBuilder()
                              .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
                              .RequireAuthenticatedUser().Build());
            });

            #endregion


            services.AddControllers();
        }
示例#12
0
        public static Container AddConfiguration <TConfigure>(this Container container, IConfigurationRoot configuration)
            where TConfigure : class, new()
        {
            var section  = configuration.GetSection(typeof(TConfigure).Name);
            var settings = new TConfigure();
            var config   = new ConfigureFromConfigurationOptions <TConfigure>(section);

            container.AddTransient <TConfigure, TConfigure>(x =>
            {
                config.Configure(settings);
                return(settings);
            });

            return(container);
        }
示例#13
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            #region Obtendo as configurações do projeto
            AppSettings appSettings = new AppSettings();
            #endregion

            #region Responsavel pela deserializacao do appsettings.json
            //
            var config = new ConfigureFromConfigurationOptions <object>(Configuration.GetSection("AppSettings"));
            config.Configure(appSettings);
            #endregion

            #region Serviço apra Cookie Autorization

            services.AddAuthentication(option => {
                option.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                option.DefaultChallengeScheme    = CookieAuthenticationDefaults.AuthenticationScheme;
                option.DefaultSignInScheme       = CookieAuthenticationDefaults.AuthenticationScheme;
            }).AddCookie(option =>
            {
                option.Cookie.Name      = "CookieAuth";
                option.AccessDeniedPath = new Microsoft.AspNetCore.Http.PathString("/Logar/Index");
                option.LoginPath        = new Microsoft.AspNetCore.Http.PathString("/Logar/Index");
                option.ExpireTimeSpan   = TimeSpan.FromDays(appSettings.CookieTempoVida);
            });

            services.AddAuthorization(option =>
            {
                option.AddPolicy("CookieAuth",
                                 new AuthorizationPolicyBuilder()
                                 .AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme)
                                 .RequireAuthenticatedUser().Build());
            });

            #endregion

            services.AddSingleton <AppSettings>(appSettings);
            System.Environment.SetEnvironmentVariable("MYSQLSTRCON", appSettings.StringConexaoMySql);



            services.AddControllersWithViews().AddRazorRuntimeCompilation();

            services.AddHttpContextAccessor();
            services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
        }
示例#14
0
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;

            #region Serviço de configuração da aplicação

            // Desserializa conteudo de configuração presente na seção appsettings.json => "Configuracao" conforme interface criada "IConfiguracao"
            var conf = new ConfigureFromConfigurationOptions <IConfiguracao>(Configuration.GetSection("Configuracao"));

            // Executa a configuração e retorna os dados no objeto do tipo "Configuracao" que tem a "IConfiguracao" como interface
            conf.Configure(_configuracao);

            // cria uma variavel globla "STR_CON" no objeto Enviorement
            Environment.SetEnvironmentVariable("STR_CON", _configuracao.StrCon);

            #endregion
        }
示例#15
0
        internal static TOptions Parse <TOptions>(IEnumerable <string> args, IDictionary <string, string> switchMapping)
            where TOptions : class, new()
        {
            var booleanSwitches = GetConfigMapCounts(typeof(TOptions), t => t == typeof(bool), switchMapping);
            var arrays          = GetConfigMapCounts(typeof(TOptions), t => (t.GetTypeInfo().IsGenericType&& t.GetGenericTypeDefinition() == typeof(List <>)) || t.IsArray, switchMapping);
            var updatedArgs     = TransformArguments(args, arrays, booleanSwitches).ToArray();

            var cmd = new ConfigurationBuilder(Directory.GetCurrentDirectory())
                      .AddCommandLine(updatedArgs, switchMapping)
                      .Build();

            var manager = new ConfigureFromConfigurationOptions <TOptions>(cmd);

            var options = new TOptions();

            manager.Action(options);

            return(options);
        }
示例#16
0
        private static SwiftyOptions AddSwiftyOptions(SchubertServicesBuilder builder, Action <SwiftyOptions> setupAction)
        {
            SwiftyOptions touchOptions = new SwiftyOptions();

            var configuration = builder.Configuration.GetSection("Schubert:Swifty") as IConfiguration ?? new ConfigurationBuilder().Build();

            var schubertDataSetup = new ConfigureFromConfigurationOptions <SwiftyOptions>(configuration);

            builder.ServiceCollection.Configure <SwiftyOptions>(configuration);

            schubertDataSetup.Configure(touchOptions);

            if (setupAction != null)
            {
                builder.ServiceCollection.Configure(setupAction);
                setupAction(touchOptions);
            }
            builder.ServiceCollection.AddSmart(SwiftyServices.GetServices());
            return(touchOptions);
        }
示例#17
0
        /// <summary>Gets a configuration by it's <paramref name="name"/>.</summary>
        /// <param name="name">The name of the configuration to obtain.</param>
        /// <returns>Configuration section of a given <paramref name="name"/> or empty configuration.</returns>
        public static ConfigurationSectionHandler GetConfiguration(string name)
        {
#if NETSTANDARD16
            ConfigurationSectionHandler result;
            if (!_configurations.TryGetValue(name, out result))
            {
                _configurations[name] = result = new ConfigurationSectionHandler();
                var configurationBinder = new ConfigureFromConfigurationOptions <ConfigurationSectionHandler>(Configuration.GetSection(name));
                try
                {
                    configurationBinder.Configure(result);
                }
                catch (TargetInvocationException error)
                {
                    throw error.InnerException;
                }
            }

            return(result);
#else
            return((ConfigurationSectionHandler)ConfigurationManager.GetSection(name) ?? new ConfigurationSectionHandler());
#endif
        }
示例#18
0
        static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder()
                          .SetBasePath(Directory.GetCurrentDirectory())
                          .AddJsonFile("appsettings.json", false, true);


            Configuration = builder.Build();

            CurrentOptions = new IGPOptions();
            Configuration.GetReloadToken().RegisterChangeCallback(reloadCallback, null);

            var configOptions = new ConfigureFromConfigurationOptions <IGPOptions>(Configuration);

            configOptions.Configure(CurrentOptions);


            var thread = AddStaff();

            thread.Wait();

            Console.ReadKey();
        }
示例#19
0
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext <ApplicationDbContext>(op => op
                                                         .UseMySql(_config.GetConnectionString("Soapstone"), o => o.ServerVersion(new Version(5, 5), ServerType.MySql)));

            services.AddScoped <IRepository <User>, GenericRepository <User> >();
            services.AddScoped <IRepository <Post>, GenericRepository <Post> >();
            services.AddScoped <IRepository <Upvote>, GenericRepository <Upvote> >();
            services.AddScoped <IRepository <Downvote>, GenericRepository <Downvote> >();
            services.AddScoped <IRepository <SavedPost>, GenericRepository <SavedPost> >();
            services.AddScoped <IRepository <Report>, GenericRepository <Report> >();

            services.AddScoped <PostService>();
            services.AddScoped <ImageUploadService>();
            services.AddScoped <TokenService>();

            var cloudinarySettings     = new CloudinarySettings();
            var cloudinaryConfigurator = new ConfigureFromConfigurationOptions <CloudinarySettings>(_config.GetSection("CloudinarySettings"));

            cloudinaryConfigurator.Configure(cloudinarySettings);
            services.AddSingleton(cloudinarySettings);

            var tokenSettings     = new TokenSettings();
            var tokenConfigurator = new ConfigureFromConfigurationOptions <TokenSettings>(_config.GetSection("TokenSettings"));

            tokenConfigurator.Configure(tokenSettings);
            services.AddSingleton <TokenSettings>(tokenSettings);

            var key = Convert.FromBase64String(tokenSettings.SecretKey);

            services.AddAuthentication(o =>
            {
                o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                o.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(o =>
            {
                o.RequireHttpsMetadata      = false;
                o.SaveToken                 = true;
                o.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidIssuer              = tokenSettings.Issuer,
                    ValidateIssuer           = true,
                    ValidAudience            = tokenSettings.Audience,
                    ValidateAudience         = true,
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey         = new SymmetricSecurityKey(key)
                };
            });

            services.AddAuthorization(o =>
            {
                o.DefaultPolicy = new AuthorizationPolicyBuilder()
                                  .RequireAuthenticatedUser()
                                  .RequireClaim(DefaultClaims.UserId)
                                  .Build();
            });

            services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info {
                    Title = "Soapstone-Backend", Version = "v1"
                });
                c.AddSecurityDefinition("Bearer", new ApiKeyScheme
                {
                    In          = "header",
                    Description = "Please enter into field the word 'Bearer' following by space and JWT",
                    Name        = "Authorization",
                    Type        = "apiKey"
                });
                c.AddSecurityRequirement(new Dictionary <string, IEnumerable <string> >
                {
                    { "Bearer", Enumerable.Empty <string>() },
                });

                var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
                var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
                c.IncludeXmlComments(xmlPath);
            });

            // TODO serilog
            // TODO post lifespan on map
            // TODO exception message overhaul
            // TODO documentation overhaul
        }
示例#20
0
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext <ApplicationDbContext>(op => op
                                                         .UseMySql(_config.GetConnectionString("enxaquecapp")));

            services.AddScoped <GenericRepository <Cause> >();
            services.AddScoped <GenericRepository <Episode> >();
            services.AddScoped <GenericRepository <Local> >();
            services.AddScoped <GenericRepository <Medication> >();
            services.AddScoped <GenericRepository <Relief> >();
            services.AddScoped <GenericRepository <User> >();

            var tokenSettings     = new TokenSettings();
            var tokenConfigurator = new ConfigureFromConfigurationOptions <TokenSettings>(_config.GetSection("TokenSettings"));

            tokenConfigurator.Configure(tokenSettings);
            services.AddSingleton <TokenSettings>(tokenSettings);
            services.AddScoped <TokenProvider>();

            var key = Convert.FromBase64String(tokenSettings.SecretKey);

            services.AddAuthentication(o =>
            {
                o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                o.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(o =>
            {
                o.RequireHttpsMetadata      = false;
                o.SaveToken                 = true;
                o.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidIssuer              = tokenSettings.Issuer,
                    ValidateIssuer           = true,
                    ValidAudience            = tokenSettings.Audience,
                    ValidateAudience         = true,
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey         = new SymmetricSecurityKey(key)
                };
            });

            services.AddAuthorization(o =>
            {
                o.DefaultPolicy = new AuthorizationPolicyBuilder()
                                  .RequireAuthenticatedUser()
                                  .RequireClaim(DefaultClaims.UserId)
                                  .Build();
            });

            services.AddCors(o => o.AddPolicy("AnyOrigin", b =>
            {
                b.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
            }));

            services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info {
                    Title = "Enxaquecapp", Version = "v1"
                });
                c.AddSecurityDefinition("Bearer", new ApiKeyScheme
                {
                    In          = "header",
                    Description = "Please enter into field the word 'Bearer' following by space and JWT",
                    Name        = "Authorization",
                    Type        = "apiKey"
                });
                c.AddSecurityRequirement(new Dictionary <string, IEnumerable <string> >
                {
                    { "Bearer", Enumerable.Empty <string>() },
                });

                var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
                var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
                c.IncludeXmlComments(xmlPath);
            });
        }
示例#21
0
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext <ApplicationDbContext>(op => op
                                                         .UseMySql(_config.GetConnectionString("somedb")));

            services.AddScoped <GenericRepository <Appointment> >();
            services.AddScoped <GenericRepository <Assignment> >();
            services.AddScoped <GenericRepository <Attendance> >();
            services.AddScoped <GenericRepository <Class> >();
            services.AddScoped <GenericRepository <Event> >();
            services.AddScoped <GenericRepository <Grade> >();
            services.AddScoped <GenericRepository <SchoolYear> >();
            services.AddScoped <GenericRepository <StudentClass> >();
            services.AddScoped <GenericRepository <Subject> >();
            services.AddScoped <GenericRepository <User> >();
            services.AddScoped <GenericRepository <UserEvent> >();
            services.AddScoped <GenericRepository <UserGuardian> >();

            services.AddScoped <TokenService>();
            services.AddScoped <NotificationService>();
            services.Configure <EmailSettings>(_config.GetSection("EmailSettings"));
            services.AddScoped <EmailService>();

            var tokenSettings     = new TokenSettings();
            var tokenConfigurator = new ConfigureFromConfigurationOptions <TokenSettings>(_config.GetSection("TokenSettings"));

            tokenConfigurator.Configure(tokenSettings);
            services.AddSingleton <TokenSettings>(tokenSettings);

            var key = Convert.FromBase64String(tokenSettings.SecretKey);

            services.AddAuthentication(o =>
            {
                o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                o.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(o =>
            {
                o.RequireHttpsMetadata      = false;
                o.SaveToken                 = true;
                o.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidIssuer              = tokenSettings.Issuer,
                    ValidateIssuer           = true,
                    ValidAudience            = tokenSettings.Audience,
                    ValidateAudience         = true,
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey         = new SymmetricSecurityKey(key)
                };
            });

            services.AddAuthorization(o =>
            {
                o.DefaultPolicy = new AuthorizationPolicyBuilder()
                                  .RequireAuthenticatedUser()
                                  .RequireClaim(DefaultClaims.UserId)
                                  .Build();
            });

            services.AddCors(o => o.AddPolicy("AnyOrigin", b =>
            {
                b.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
            }));

            services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info {
                    Title = "Diary-Backend", Version = "v1"
                });

                c.AddSecurityDefinition("Bearer", new ApiKeyScheme
                {
                    In          = "header",
                    Description = "Please enter into field the word 'Bearer' following by space and JWT",
                    Name        = "Authorization",
                    Type        = "apiKey"
                });

                c.AddSecurityRequirement(new Dictionary <string, IEnumerable <string> >
                {
                    { "Bearer", Enumerable.Empty <string>() },
                });

                var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
                var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
                c.IncludeXmlComments(xmlPath);
            });

            services.AddHangfire(config => config
                                 .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                                 .UseSimpleAssemblyNameTypeSerializer()
                                 .UseRecommendedSerializerSettings()
                                 .UseStorage(new MySqlStorage(_config.GetConnectionString("hangfiredb"))));

            services.AddHangfireServer();
        }
        private static void ConfigureJwtOptions(IServiceCollection services, IConfiguration configuration)
        {
            IConfigurationSection jwtConfigurationSection = configuration.GetSection(nameof(JwtOptions));
            JwtOptions            jwtOptions = new JwtOptions();

            if (!jwtConfigurationSection.Exists())
            {
                throw new InvalidOperationException($"Missing {nameof(JwtOptions)} Configuration section");
            }

            ConfigureFromConfigurationOptions <JwtOptions> jwtConfigure =
                new ConfigureFromConfigurationOptions <JwtOptions>(jwtConfigurationSection);

            jwtConfigure.Configure(jwtOptions);
            IJwtSigningOptions jwtSigningOptions = new JwtSigningOptions(jwtOptions);

            services.AddSingleton <IJwtOptions>(jwtOptions);
            services.AddSingleton(jwtSigningOptions);
            services.AddSingleton <IWebSocketManager, WebSocketManager>();

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidAudience    = jwtOptions.Audience,
                    ValidIssuer      = jwtOptions.Issuer,
                    ValidateAudience = true,
                    ValidateIssuer   = true,
                    ClockSkew        = TimeSpan.Zero,
                    IssuerSigningKey = jwtSigningOptions.SigningCredentials.Key
                };

                options.Events = new JwtBearerEvents
                {
                    OnMessageReceived = context =>
                    {
                        var accessToken = context.Request.Query["access_token"];

                        var path = context.HttpContext.Request.Path;
                        if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments("/ws"))
                        {
                            context.Token = accessToken;
                        }

                        return(Task.CompletedTask);
                    }
                };
            });

            services.AddAuthorization(auth =>
            {
                var policy = new AuthorizationPolicyBuilder()
                             .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
                             .RequireAuthenticatedUser()
                             .Build();

                auth.AddPolicy(JwtBearerDefaults.AuthenticationScheme, policy);
            });

            services.AddControllers(options =>
            {
                AuthorizationPolicy policy = new AuthorizationPolicyBuilder()
                                             .RequireAuthenticatedUser()
                                             .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
                                             .Build();
                options.Filters.Add(new AuthorizeFilter(policy));
            })
            .AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                options.SerializerSettings.NullValueHandling     = NullValueHandling.Ignore;
            });
            services
            .AddSignalR(options => options.EnableDetailedErrors = true)
            .AddJsonProtocol();
            services.AddHttpContextAccessor();
        }