Exemple #1
0
        private static Action <WebHostBuilderContext, IServiceCollection> ConfigureServices(
            NethiumConfig nethiumConfig, IConsulHandler consulHandler, IConsulBuilder consulBuilder
            ) =>
        (context, collection) =>
        {
            var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(context.Configuration["Nethium:ServerSecretKey"] ?? throw new ArgumentNullException("Nethium:ServerSecretKey", "ServerSecretKey not specified in config")));

            var tokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey         = signingKey,

                RequireExpirationTime = true,
                ValidateLifetime      = true,

                ValidateAudience = false,
                ValidateActor    = false,
                ValidateIssuer   = false
            };

            collection.AddSingleton(
                new JwtHeader(new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256)));

            collection.AddHttpContextAccessor();
            collection.AddHttpClient();
            collection.Configure <ServerIdentifier>(context.Configuration.GetSection("Nethium"));
            collection.Configure <ConfigurationOptions>(o =>
            {
                o.Prefix = nethiumConfig.Prefix !;
                o.ConfigurationPrefix = nethiumConfig.ConfigurationPrefix;
                o.Separator           = nethiumConfig.Separator !;
                o.Watch      = nethiumConfig.Watch;
                o.AutoReload = nethiumConfig.AutoReload ?? false;
            });
            collection.AddSingleton(consulHandler);
            collection.AddSingleton(consulBuilder);
            collection.AddScoped <IAuthHandler, StubAuthHandler>();
            collection.AddScoped <ISwaggerStubHandler, SwaggerStubHandler>();
            collection.AddScoped <IConsulKvEndpoint, ConsulKvEndpoint>();
            collection.AddScoped <IConsulServiceEndpoint, ConsulServiceEndpoint>();
            collection.AddScoped <IServicesLocator, ConsulServicesLocator>();
            collection.AddScoped(typeof(IServiceFactory <>), typeof(SwaggerServiceFactory <>));
            collection.AddScoped(typeof(IServiceChooseStrategy <>), typeof(NearestStrategy <>));
            collection.AddHostedService <NethiumHostedService>();
            collection.AddOpenApiDocument();
            collection
            .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options => { options.TokenValidationParameters = tokenValidationParameters; });
        };
Exemple #2
0
        private static Action <ConsulClientConfiguration> ClientConfiguration(
            IConfiguration?bootstrapConfig, NethiumConfig nethiumConfig
            ) =>
        config =>
        {
            if (bootstrapConfig != null)
            {
                config.Address = bootstrapConfig["Nethium:Consul:Address"] != null
                        ? new Uri(bootstrapConfig["Nethium:Consul:Address"])
                        : config.Address;
                config.Datacenter = bootstrapConfig["Nethium:Consul:Datacenter"];
                config.Token      = bootstrapConfig["Nethium:Consul:Token"];
                config.WaitTime   = bootstrapConfig["Nethium:Consul:WaitTime"]?.ToTimeSpanSeconds();
            }

            nethiumConfig.ClientConfig?.Invoke(config);
        };
Exemple #3
0
 private static Action <WebHostBuilderContext, IConfigurationBuilder> ConfigureAppConfiguration(
     ConfigurationOptions configurationOptions,
     NethiumConfig nethiumConfig,
     IConsulHandler consulHandler,
     IConsulBuilder consulBuilder
     ) =>
 (context, configurationBuilder) =>
 {
     var consulKvEndpoint = new ConsulKvEndpoint(consulBuilder,
                                                 nethiumConfig.LoggerFactory?.CreateLogger <ConsulKvEndpoint>())
     {
         WatchExceptionHandler = WatchExceptionHandler
     };
     configurationBuilder
     .AddJsonFile("nethium.json", true, true)
     .AddEnvironmentVariables("NETHIUM_")
     .Add(new ConsulConfigurationSource(configurationOptions, consulHandler, consulKvEndpoint));
 };
Exemple #4
0
        public static IWebHostBuilder UseNethium(this IWebHostBuilder builder,
                                                 Action <NethiumConfig> configureNethiumOption)
        {
            var nethiumConfig = new NethiumConfig();

            configureNethiumOption(nethiumConfig);
            nethiumConfig.CancellationToken ??= builder.GetShutdownToken();
            var bootstrapConfig = nethiumConfig.BootstrapConfig;
            var logger          = nethiumConfig.LoggerFactory?.CreateLogger <NethiumConfig>();

            if (bootstrapConfig != null)
            {
                nethiumConfig.Prefix ??= bootstrapConfig["Nethium:Consul:Prefix"] ?? throw new ArgumentNullException("Nethium:Consul:Prefix", "Consul:Prefix not specified in config");
                nethiumConfig.ConfigurationPrefix ??= bootstrapConfig["Nethium:Consul:ConfigurationPrefix"] ??
                nethiumConfig.Prefix;
                nethiumConfig.Separator ??= bootstrapConfig["Nethium:Consul:Separator"];
                nethiumConfig.Watch ??= bootstrapConfig["Nethium:Consul:Watch"];
            }

            var configurationOptions = new ConfigurationOptions
            {
                Prefix = nethiumConfig.Prefix !,
                ConfigurationPrefix = nethiumConfig.ConfigurationPrefix,
                Separator           = nethiumConfig.Separator !,
                Watch      = nethiumConfig.Watch,
                AutoReload = nethiumConfig.AutoReload ?? false
            };

            var consulHandler = new ConsulHandler
            {
                ClientConfigurationOptions = ClientConfiguration(bootstrapConfig, nethiumConfig),
                CancellationToken          = nethiumConfig.CancellationToken
            };
            var consulBuilder             = new ConsulBuilder(consulHandler);
            var consulClientConfiguration = new ConsulClientConfiguration();

            consulHandler.ClientConfigurationOptions.Invoke(consulClientConfiguration);
            foreach (var pair in bootstrapConfig.AsEnumerable())
            {
                logger?.LogInformation(pair.Key + ": " + pair.Value);
            }
            logger?.LogInformation(bootstrapConfig?["Nethium:Consul:Watch"]);
            logger?.LogInformation($"Using consul at address {consulClientConfiguration.Address} " +
                                   $"{(string.IsNullOrEmpty(consulClientConfiguration.Datacenter) ? "" : "datacenter " + consulClientConfiguration.Datacenter)}");
            logger?.LogInformation($"Consul config prefix {configurationOptions.Prefix}" +
                                   $"{(string.IsNullOrEmpty(configurationOptions.ConfigurationPrefix) ? "" : " (" + configurationOptions.ConfigurationPrefix + ") ")}" +
                                   $"{(string.IsNullOrEmpty(configurationOptions.Watch) ? "" : "watching " + configurationOptions.Watch + (configurationOptions.AutoReload ? " auto-reload" : " no auto-reload"))}");
            if (nethiumConfig.HostConfiguration)
            {
                logger?.LogInformation("Injecting Nethium config provider to host configuration");
                var consulKvEndpoint = new ConsulKvEndpoint(consulBuilder,
                                                            nethiumConfig.LoggerFactory?.CreateLogger <ConsulKvEndpoint>())
                {
                    WatchExceptionHandler = WatchExceptionHandler
                };
                var configurationBuilder = new ConfigurationBuilder();
                if (bootstrapConfig != null)
                {
                    configurationBuilder.AddConfiguration(bootstrapConfig);
                }

                var configurationRoot = configurationBuilder
                                        .AddConsul(configurationOptions, consulHandler, consulKvEndpoint)
                                        .Build();

                builder
                .UseConfiguration(configurationRoot);
            }

            builder
            .ConfigureServices(ConfigureServices(nethiumConfig, consulHandler, consulBuilder))
            .ConfigureAppConfiguration(ConfigureAppConfiguration(configurationOptions, nethiumConfig, consulHandler,
                                                                 consulBuilder));
            return(builder);
        }