public static AuthorizationPolicyBuilder RequireScope( this AuthorizationPolicyBuilder authorizationPolicyBuilder, params string[] requiredScopes) { authorizationPolicyBuilder.RequireScope((IEnumerable <string>)requiredScopes); return(authorizationPolicyBuilder); }
public static AuthorizationPolicyBuilder RequireScopesAll(this AuthorizationPolicyBuilder @this, IEnumerable <string> scopes) { foreach (var scope in scopes) { @this.RequireScope(scope); } return(@this); }
public void SingleScopeRegistrationTest() { const string openIdScope = "openid"; var builder = new AuthorizationPolicyBuilder(); builder.RequireScope(openIdScope); var requiredScopes = ((ScopeAuthorizationRequirement)builder.Requirements.ToList()[0]).RequiredScopes.ToList(); Assert.Single(requiredScopes, openIdScope); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddCors(options => options.UseConfiguredCors(Configuration.GetSection("CorsPolicy"))); services.AddSignalR() .AddJsonProtocol(options => { options.PayloadSerializerSettings.Converters.Add(new StringEnumConverter()); }); services.AddMvc(options => { // Require all scopes in authOptions var policyBuilder = new AuthorizationPolicyBuilder().RequireAuthenticatedUser(); Array.ForEach(_authOptions.AuthorizationScope.Split(' '), x => policyBuilder.RequireScope(x)); var policy = policyBuilder.Build(); options.Filters.Add(new AuthorizeFilter(policy)); }); // allow upload of large files services.Configure <FormOptions>(x => { x.ValueLengthLimit = int.MaxValue; x.MultipartBodyLengthLimit = int.MaxValue; }); services.Configure <VmOptions>(Configuration.GetSection("VMOptions")); services.Configure <RewriteHostOptions>(Configuration.GetSection("RewriteHost")); services.AddScoped <VmService>(); services.AddSingleton <ConnectionService>(); services.AddSingleton <IHostedService>(x => x.GetService <ConnectionService>()); services.AddSingleton <IConnectionService>(x => x.GetService <ConnectionService>()); services.AddSingleton <TaskService>(); services.AddSingleton <IHostedService>(x => x.GetService <TaskService>()); services.AddSwagger(_authOptions); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = _authOptions.Authority; options.RequireHttpsMetadata = _authOptions.RequireHttpsMetadata; options.SaveToken = true; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidAudiences = _authOptions.AuthorizationScope.Split(' ') }; }); services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>(); services.AddScoped <IPrincipal>(p => p.GetService <IHttpContextAccessor>().HttpContext.User); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var provider = Configuration["Database:Provider"]; switch (provider) { case "InMemory": services.AddDbContextPool <AlloyContext>((ServiceProvider, builder) => builder .AddInterceptors(ServiceProvider.GetRequiredService <EventTransactionInterceptor>()) .UseInMemoryDatabase("api")); break; case "Sqlite": case "SqlServer": case "PostgreSQL": services.AddDbContextPool <AlloyContext>((serviceProvider, builder) => builder .AddInterceptors(serviceProvider.GetRequiredService <EventTransactionInterceptor>()) .UseConfiguredDatabase(Configuration)); break; } services.AddSingleton <StartupHealthCheck>(); services.AddSingleton <HostedServiceHealthCheck>(); services.AddHealthChecks() .AddCheck <StartupHealthCheck>( "startup", failureStatus: HealthStatus.Degraded, tags: new[] { "ready" }) .AddCheck <HostedServiceHealthCheck>( "service_responsive", failureStatus: HealthStatus.Unhealthy, tags: new[] { "live" }); var connectionString = Configuration.GetConnectionString(DatabaseExtensions.DbProvider(Configuration)); switch (provider) { case "Sqlite": services.AddHealthChecks().AddSqlite(connectionString, tags: new[] { "ready", "live" }); break; case "SqlServer": services.AddHealthChecks().AddSqlServer(connectionString, tags: new[] { "ready", "live" }); break; case "PostgreSQL": services.AddHealthChecks().AddNpgSql(connectionString, tags: new[] { "ready", "live" }); break; } services.AddOptions() .Configure <DatabaseOptions>(Configuration.GetSection("Database")) .AddScoped(config => config.GetService <IOptionsMonitor <DatabaseOptions> >().CurrentValue) .Configure <ClaimsTransformationOptions>(Configuration.GetSection("ClaimsTransformation")) .AddScoped(config => config.GetService <IOptionsMonitor <ClaimsTransformationOptions> >().CurrentValue); services .Configure <ClientOptions>(Configuration.GetSection("ClientSettings")) .AddScoped(config => config.GetService <IOptionsMonitor <ClientOptions> >().CurrentValue); services .Configure <FilesOptions>(Configuration.GetSection("Files")) .AddScoped(config => config.GetService <IOptionsMonitor <FilesOptions> >().CurrentValue); services .Configure <ResourceOwnerAuthorizationOptions>(Configuration.GetSection("ResourceOwnerAuthorization")) .AddScoped(config => config.GetService <IOptionsMonitor <ResourceOwnerAuthorizationOptions> >().CurrentValue); services .Configure <ResourceOptions>(Configuration.GetSection("Resource")) .AddScoped(config => config.GetService <IOptionsMonitor <ResourceOptions> >().CurrentValue); services.AddCors(options => options.UseConfiguredCors(Configuration.GetSection("CorsPolicy"))); services.AddSignalR() .AddJsonProtocol(options => { options.PayloadSerializerOptions.PropertyNameCaseInsensitive = true; options.PayloadSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.PayloadSerializerOptions.Converters.Add(new JsonDateTimeConverter()); }); services.AddMvc(options => { options.Filters.Add(typeof(ValidateModelStateFilter)); options.Filters.Add(typeof(JsonExceptionFilter)); // Require all scopes in authOptions var policyBuilder = new AuthorizationPolicyBuilder().RequireAuthenticatedUser(); Array.ForEach(_authOptions.AuthorizationScope.Split(' '), x => policyBuilder.RequireScope(x)); var policy = policyBuilder.Build(); options.Filters.Add(new AuthorizeFilter(policy)); }) .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonNullableGuidConverter()); // options.JsonSerializerOptions.Converters.Add(new JsonIntegerConverter()); options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.Converters.Add(new JsonDateTimeConverter()); }); services.AddSwagger(_authOptions); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = _authOptions.Authority; options.RequireHttpsMetadata = _authOptions.RequireHttpsMetadata; options.SaveToken = true; options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { ValidateIssuer = true, ValidAudiences = _authOptions.AuthorizationScope.Split(' ') }; options.Events = new JwtBearerEvents { OnMessageReceived = context => { // If the request is for our hub... var path = context.HttpContext.Request.Path; var accessToken = context.Request.Query["access_token"]; if (!string.IsNullOrEmpty(accessToken) && (path.StartsWithSegments("/hubs"))) { // Read the token out of the query string context.Token = accessToken; } return(Task.CompletedTask); } }; }); services.AddRouting(options => { options.LowercaseUrls = true; }); services.AddMemoryCache(); services.AddScoped <IEventTemplateService, EventTemplateService>(); services.AddScoped <IEventService, EventService>(); services.AddScoped <ICasterService, CasterService>(); services.AddScoped <IPlayerService, PlayerService>(); services.AddScoped <ISteamfitterService, SteamfitterService>(); services.AddScoped <IUserClaimsService, UserClaimsService>(); services.AddTransient <EventTransactionInterceptor>(); // add the other API clients services.AddPlayerApiClient(); services.AddCasterApiClient(); services.AddSteamfitterApiClient(); // add the background IHostedServices services.AddAlloyBackgroundService(); services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>(); services.AddScoped <IPrincipal>(p => p.GetService <IHttpContextAccessor>().HttpContext.User); services.AddHttpClient(); ApplyPolicies(services); services.AddAutoMapper(cfg => { cfg.ForAllPropertyMaps( pm => pm.SourceType != null && Nullable.GetUnderlyingType(pm.SourceType) == pm.DestinationType, (pm, c) => c.MapFrom <object, object, object, object>(new IgnoreNullSourceValues(), pm.SourceMember.Name)); }, typeof(Startup)); services.AddMediatR(typeof(Startup).GetTypeInfo().Assembly); services.AddScoped <IClaimsTransformation, AuthorizationClaimsTransformer>(); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var provider = Configuration["Database:Provider"]; switch (provider) { case "InMemory": services.AddDbContextPool <AlloyContext>(opt => opt.UseInMemoryDatabase("api")); break; case "Sqlite": case "SqlServer": case "PostgreSQL": services.AddDbProvider(Configuration); services.AddDbContextPool <AlloyContext>(builder => builder.UseConfiguredDatabase(Configuration)); break; } services.AddOptions() .Configure <DatabaseOptions>(Configuration.GetSection("Database")) .AddScoped(config => config.GetService <IOptionsMonitor <DatabaseOptions> >().CurrentValue) .Configure <ClaimsTransformationOptions>(Configuration.GetSection("ClaimsTransformation")) .AddScoped(config => config.GetService <IOptionsMonitor <ClaimsTransformationOptions> >().CurrentValue); services .Configure <ClientOptions>(Configuration.GetSection("ClientSettings")) .AddScoped(config => config.GetService <IOptionsMonitor <ClientOptions> >().CurrentValue); services .Configure <FilesOptions>(Configuration.GetSection("Files")) .AddScoped(config => config.GetService <IOptionsMonitor <FilesOptions> >().CurrentValue); services .Configure <ResourceOwnerAuthorizationOptions>(Configuration.GetSection("ResourceOwnerAuthorization")) .AddScoped(config => config.GetService <IOptionsMonitor <ResourceOwnerAuthorizationOptions> >().CurrentValue); services .Configure <ResourceOptions>(Configuration.GetSection("Resource")) .AddScoped(config => config.GetService <IOptionsMonitor <ResourceOptions> >().CurrentValue); services.AddCors(options => options.UseConfiguredCors(Configuration.GetSection("CorsPolicy"))); services.AddSignalR() .AddJsonProtocol(options => { options.PayloadSerializerSettings.Converters.Add(new StringEnumConverter()); }); services.AddMvc(options => { options.Filters.Add(typeof(ValidateModelStateFilter)); options.Filters.Add(typeof(JsonExceptionFilter)); // Require all scopes in authOptions var policyBuilder = new AuthorizationPolicyBuilder().RequireAuthenticatedUser(); Array.ForEach(_authOptions.AuthorizationScope.Split(' '), x => policyBuilder.RequireScope(x)); var policy = policyBuilder.Build(); options.Filters.Add(new AuthorizeFilter(policy)); }) .AddJsonOptions(options => { options.SerializerSettings.Converters.Add(new StringEnumConverter()); }) .SetCompatibilityVersion(CompatibilityVersion.Latest); services.AddSwagger(_authOptions); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = _authOptions.Authority; options.RequireHttpsMetadata = _authOptions.RequireHttpsMetadata; options.SaveToken = true; options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { ValidateIssuer = true, ValidAudiences = _authOptions.AuthorizationScope.Split(' ') }; }); services.AddRouting(options => { options.LowercaseUrls = true; }); services.AddMemoryCache(); services.AddScoped <IDefinitionService, DefinitionService>(); services.AddScoped <IImplementationService, ImplementationService>(); services.AddScoped <ICasterService, CasterService>(); services.AddScoped <IPlayerService, PlayerService>(); services.AddScoped <ISteamfitterService, SteamfitterService>(); services.AddScoped <IUserClaimsService, UserClaimsService>(); // add the other API clients services.AddS3PlayerApiClient(); services.AddCasterApiClient(); services.AddSteamfitterApiClient(); // add the background IHostedServices services.AddAlloyBackgroundService(); services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>(); services.AddScoped <IPrincipal>(p => p.GetService <IHttpContextAccessor>().HttpContext.User); services.AddHttpClient(); ApplyPolicies(services); services.AddAutoMapper(); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var provider = Configuration["Database:Provider"]; switch (provider) { case "InMemory": services.AddDbContextPool <SteamfitterContext>(opt => opt.UseInMemoryDatabase("api")); break; case "Sqlite": case "SqlServer": case "PostgreSQL": services.AddDbContextPool <SteamfitterContext>(builder => builder.UseConfiguredDatabase(Configuration)); break; } services.AddOptions() .Configure <DatabaseOptions>(Configuration.GetSection("Database")) .AddScoped(config => config.GetService <IOptionsMonitor <DatabaseOptions> >().CurrentValue) .Configure <ClaimsTransformationOptions>(Configuration.GetSection("ClaimsTransformation")) .AddScoped(config => config.GetService <IOptionsMonitor <ClaimsTransformationOptions> >().CurrentValue) .Configure <SeedDataOptions>(Configuration.GetSection("SeedData")) .AddScoped(config => config.GetService <IOptionsMonitor <SeedDataOptions> >().CurrentValue); services .Configure <ClientOptions>(Configuration.GetSection("ClientSettings")) .AddScoped(config => config.GetService <IOptionsMonitor <ClientOptions> >().CurrentValue); services .Configure <FilesOptions>(Configuration.GetSection("Files")) .AddScoped(config => config.GetService <IOptionsMonitor <FilesOptions> >().CurrentValue); services.AddScoped <IPlayerVmService, PlayerVmService>(); services.AddScoped <IPlayerService, PlayerService>(); services.AddScoped <IClaimsTransformation, AuthorizationClaimsTransformer>(); services.AddScoped <IUserClaimsService, UserClaimsService>(); services.AddCors(options => options.UseConfiguredCors(Configuration.GetSection("CorsPolicy"))); services.AddSignalR() .AddJsonProtocol(options => { options.PayloadSerializerOptions.Converters.Add(new JsonStringEnumConverter()); }); services.AddMvc(options => { options.Filters.Add(typeof(ValidateModelStateFilter)); options.Filters.Add(typeof(JsonExceptionFilter)); // Require all scopes in authOptions var policyBuilder = new AuthorizationPolicyBuilder().RequireAuthenticatedUser(); Array.ForEach(_authOptions.AuthorizationScope.Split(' '), x => policyBuilder.RequireScope(x)); var policy = policyBuilder.Build(); options.Filters.Add(new AuthorizeFilter(policy)); }) .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonNullableGuidConverter()); options.JsonSerializerOptions.Converters.Add(new JsonIntegerConverter()); options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); }) .SetCompatibilityVersion(CompatibilityVersion.Latest); services.AddSwagger(_authOptions); services.AddPlayerApiClient(); services.AddPlayerVmApiClient(); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = _authOptions.Authority; options.RequireHttpsMetadata = _authOptions.RequireHttpsMetadata; options.SaveToken = true; options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { ValidateIssuer = true, ValidAudiences = _authOptions.AuthorizationScope.Split(' ') }; }); services.AddRouting(options => { options.LowercaseUrls = true; }); services.AddMemoryCache(); services.AddScoped <IScenarioService, ScenarioService>(); services.AddScoped <ITaskService, TaskService>(); services.AddScoped <IResultService, ResultService>(); services.AddScoped <IScenarioTemplateService, ScenarioTemplateService>(); services.AddScoped <IPermissionService, PermissionService>(); services.AddScoped <IUserService, UserService>(); services.AddScoped <IUserPermissionService, UserPermissionService>(); services.AddScoped <IFilesService, FilesService>(); services.AddScoped <IBondAgentService, BondAgentService>(); services.AddScoped <IVmCredentialService, VmCredentialService>(); services.AddSingleton <StackStormService>(); services.AddSingleton <IHostedService>(x => x.GetService <StackStormService>()); services.AddSingleton <IStackStormService>(x => x.GetService <StackStormService>()); services.AddSingleton <BondAgentStore>(); services.AddSingleton <ITaskExecutionQueue, TaskExecutionQueue>(); services.AddHostedService <TaskExecutionService>(); services.AddHostedService <TaskMaintenanceService>(); services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>(); services.AddScoped <IPrincipal>(p => p.GetService <IHttpContextAccessor>().HttpContext.User); services.AddHttpClient(); ApplyPolicies(services); services.AddAutoMapper(cfg => { cfg.ForAllPropertyMaps( pm => pm.SourceType != null && Nullable.GetUnderlyingType(pm.SourceType) == pm.DestinationType, (pm, c) => c.MapFrom <object, object, object, object>(new IgnoreNullSourceValues(), pm.SourceMember.Name)); }, typeof(Startup)); services.Configure <VmTaskProcessingOptions>(Configuration.GetSection("VmTaskProcessing")); services .Configure <ResourceOwnerAuthorizationOptions>(Configuration.GetSection("ResourceOwnerAuthorization")) .AddScoped(config => config.GetService <IOptionsMonitor <ResourceOwnerAuthorizationOptions> >().CurrentValue); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddSingleton <TaskServiceHealthCheck>(); services.AddSingleton <ConnectionServiceHealthCheck>(); services.AddHealthChecks() .AddCheck <TaskServiceHealthCheck>( "task_service_responsive", failureStatus: HealthStatus.Unhealthy, tags: new[] { "live" }) .AddCheck <ConnectionServiceHealthCheck>( "connection_service_responsive", failureStatus: HealthStatus.Unhealthy, tags: new[] { "live" }); var provider = Configuration["Database:Provider"]; switch (provider) { case "InMemory": services.AddDbContextPool <VmContext>((serviceProvider, optionsBuilder) => optionsBuilder .AddInterceptors(serviceProvider.GetRequiredService <EventTransactionInterceptor>()) .UseInMemoryDatabase("vm")); break; case "Sqlite": case "SqlServer": case "PostgreSQL": services.AddDbContextPool <VmContext>((serviceProvider, optionsBuilder) => optionsBuilder .AddInterceptors(serviceProvider.GetRequiredService <EventTransactionInterceptor>()) .UseConfiguredDatabase(Configuration)); break; } var connectionString = Configuration.GetConnectionString(Configuration.GetValue <string>("Database:Provider", "Sqlite").Trim()); switch (provider) { case "Sqlite": services.AddHealthChecks().AddSqlite(connectionString, tags: new[] { "ready", "live" }); break; case "SqlServer": services.AddHealthChecks().AddSqlServer(connectionString, tags: new[] { "ready", "live" }); break; case "PostgreSQL": services.AddHealthChecks().AddNpgSql(connectionString, tags: new[] { "ready", "live" }); break; } services.AddOptions() .Configure <DatabaseOptions>(Configuration.GetSection("Database")) .AddScoped(config => config.GetService <IOptionsMonitor <DatabaseOptions> >().CurrentValue); IConfiguration isoConfig = Configuration.GetSection("IsoUpload"); IsoUploadOptions isoOptions = new IsoUploadOptions(); isoConfig.Bind(isoOptions); services.AddOptions() .Configure <IsoUploadOptions>(isoConfig) .AddScoped(config => config.GetService <IOptionsMonitor <IsoUploadOptions> >().CurrentValue); services .Configure <ClientOptions>(Configuration.GetSection("ClientSettings")) .AddScoped(config => config.GetService <IOptionsMonitor <ClientOptions> >().CurrentValue); services .Configure <VsphereOptions>(Configuration.GetSection("Vsphere")) .AddScoped(config => config.GetService <IOptionsSnapshot <VsphereOptions> >().Value); services .Configure <RewriteHostOptions>(Configuration.GetSection("RewriteHost")) .AddScoped(config => config.GetService <IOptionsSnapshot <RewriteHostOptions> >().Value); services .Configure <IdentityClientOptions>(Configuration.GetSection("IdentityClient")) .AddScoped(config => config.GetService <IOptionsSnapshot <IdentityClientOptions> >().Value); services .Configure <ConsoleUrlOptions>(Configuration.GetSection("ConsoleUrls")) .AddScoped(config => config.GetService <IOptionsSnapshot <ConsoleUrlOptions> >().Value); services.AddCors(options => options.UseConfiguredCors(Configuration.GetSection("CorsPolicy"))); services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); }); services.AddAuthorization(options => { var policyBuilder = new AuthorizationPolicyBuilder().RequireAuthenticatedUser(); foreach (var scope in _authOptions.AuthorizationScope.Split(' ')) { policyBuilder.RequireScope(scope); } options.DefaultPolicy = policyBuilder.Build(); options.AddPolicy(Constants.PrivilegedAuthorizationPolicy, builder => builder .RequireAuthenticatedUser() .RequireScope(_authOptions.PrivilegedScope) ); }); services.AddSignalR() .AddJsonProtocol(options => { options.PayloadSerializerOptions.PropertyNameCaseInsensitive = true; options.PayloadSerializerOptions.Converters.Add(new JsonStringEnumConverter()); }); // allow upload of large files services.Configure <FormOptions>(x => { x.ValueLengthLimit = int.MaxValue; x.MultipartBodyLengthLimit = isoOptions.MaxFileSize; }); services.AddSwagger(_authOptions); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = _authOptions.Authority; options.RequireHttpsMetadata = _authOptions.RequireHttpsMetadata; options.SaveToken = true; options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { ValidateAudience = false, ValidateIssuer = true }; options.Events = new JwtBearerEvents { OnMessageReceived = context => { // If the request is for our hub... var path = context.HttpContext.Request.Path; var accessToken = context.Request.Query["access_token"]; if (!string.IsNullOrEmpty(accessToken) && (path.StartsWithSegments("/hubs"))) { // Read the token out of the query string context.Token = accessToken; } return(Task.CompletedTask); } }; }); services.AddRouting(options => { options.LowercaseUrls = true; }); services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>(); services.AddScoped <IPrincipal>(p => p.GetService <IHttpContextAccessor>().HttpContext.User); services.AddScoped <IVmService, VmService>(); services.AddScoped <IPlayerService, PlayerService>(); services.AddScoped <IViewService, ViewService>(); services.AddScoped <IPermissionsService, PermissionsService>(); services.AddSingleton <CallbackBackgroundService>(); services.AddSingleton <IHostedService>(x => x.GetService <CallbackBackgroundService>()); services.AddSingleton <ICallbackBackgroundService>(x => x.GetService <CallbackBackgroundService>()); services.AddSingleton <IAuthenticationService, AuthenticationService>(); services.AddSingleton <IActiveVirtualMachineService, ActiveVirtualMachineService>(); // Vsphere Services services.AddSingleton <ConnectionService>(); services.AddSingleton <IHostedService>(x => x.GetService <ConnectionService>()); services.AddSingleton <IConnectionService>(x => x.GetService <ConnectionService>()); services.AddScoped <IVsphereService, VsphereService>(); services.AddSingleton <TaskService>(); services.AddSingleton <IHostedService>(x => x.GetService <TaskService>()); services.AddSingleton <ITaskService>(x => x.GetService <TaskService>()); services.AddSingleton <MachineStateService>(); services.AddSingleton <IHostedService>(x => x.GetService <MachineStateService>()); services.AddSingleton <IMachineStateService>(x => x.GetService <MachineStateService>()); services.AddTransient <EventTransactionInterceptor>(); services.AddAutoMapper(typeof(Startup)); services.AddMediatR(typeof(Startup).GetTypeInfo().Assembly); services.AddTransient(typeof(IPipelineBehavior <,>), typeof(CheckTasksBehavior <,>)); services.AddMemoryCache(); services.AddApiClients(identityClientOptions: _identityClientOptions, clientOptions: _clientOptions); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var provider = Configuration["Database:Provider"]; switch (provider) { case "InMemory": services.AddDbContextPool <Context>(opt => opt.UseInMemoryDatabase("vm")); break; case "Sqlite": case "SqlServer": case "PostgreSQL": services.AddDbProvider(Configuration); services.AddDbContextPool <Context>(builder => builder.UseConfiguredDatabase(Configuration)); break; } services.AddOptions() .Configure <DatabaseOptions>(Configuration.GetSection("Database")) .AddScoped(config => config.GetService <IOptionsMonitor <DatabaseOptions> >().CurrentValue); IConfiguration isoConfig = Configuration.GetSection("IsoUpload"); IsoUploadOptions isoOptions = new IsoUploadOptions(); isoConfig.Bind(isoOptions); services.AddOptions() .Configure <IsoUploadOptions>(isoConfig) .AddScoped(config => config.GetService <IOptionsMonitor <IsoUploadOptions> >().CurrentValue); services .Configure <ClientOptions>(Configuration.GetSection("ClientSettings")) .AddScoped(config => config.GetService <IOptionsMonitor <ClientOptions> >().CurrentValue); services.AddCors(options => options.UseConfiguredCors(Configuration.GetSection("CorsPolicy"))); services.AddMvc(options => { options.Filters.Add(typeof(ValidateModelStateFilter)); options.Filters.Add(typeof(JsonExceptionFilter)); // Require all scopes in authOptions var policyBuilder = new AuthorizationPolicyBuilder().RequireAuthenticatedUser(); Array.ForEach(_authOptions.AuthorizationScope.Split(' '), x => policyBuilder.RequireScope(x)); var policy = policyBuilder.Build(); options.Filters.Add(new AuthorizeFilter(policy)); }) .AddJsonOptions(options => { options.SerializerSettings.Converters.Add(new StringEnumConverter()); }) .SetCompatibilityVersion(CompatibilityVersion.Version_2_1); // allow upload of large files services.Configure <FormOptions>(x => { x.ValueLengthLimit = int.MaxValue; x.MultipartBodyLengthLimit = isoOptions.MaxFileSize; }); services.AddSwagger(_authOptions); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = _authOptions.Authority; options.RequireHttpsMetadata = _authOptions.RequireHttpsMetadata; options.SaveToken = true; options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { ValidateIssuer = true, ValidAudiences = _authOptions.AuthorizationScope.Split(' ') }; }); services.AddRouting(options => { options.LowercaseUrls = true; }); services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>(); services.AddScoped <IPrincipal>(p => p.GetService <IHttpContextAccessor>().HttpContext.User); services.AddScoped <IVmService, VmService>(); services.AddScoped <IPlayerService, PlayerService>(); services.AddAutoMapper(); services.AddHttpClient(); services.AddScoped <IS3PlayerApiClient, S3PlayerApiClient>(p => { var httpContextAccessor = p.GetRequiredService <IHttpContextAccessor>(); var httpClientFactory = p.GetRequiredService <IHttpClientFactory>(); var clientOptions = p.GetRequiredService <ClientOptions>(); var playerUri = new Uri(clientOptions.urls.playerApi); string authHeader = httpContextAccessor.HttpContext.Request.Headers["Authorization"]; var httpClient = httpClientFactory.CreateClient(); httpClient.BaseAddress = playerUri; httpClient.DefaultRequestHeaders.Add("Authorization", authHeader); var s3PlayerApiClient = new S3PlayerApiClient(httpClient, true); s3PlayerApiClient.BaseUri = playerUri; return(s3PlayerApiClient); }); }