/// <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); }
// 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); }
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); }
// 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>(); }
/// <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); }
/// <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); }
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); }
// 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(); }
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); }
// 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>(); }
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 }
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); }
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(); }
/// <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 }
// 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); }); }
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(); }
// 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(); }
// 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 }