public static ILetPortalBuilder AddIdentity(this ILetPortalBuilder builder) { builder.Services.Configure <EmailOptions>(builder.Configuration.GetSection("EmailOptions")); var databaseOptions = builder.Configuration.GetSection("DatabaseOptions").Get <DatabaseOptions>(); RegisterRepos(builder.Services, databaseOptions); builder.Services.AddTransient <IIdentityServiceProvider, InternalIdentityServiceProvider>(); builder.Services.AddSingleton <IEmailServiceProvider, EmailServiceProvider>(); builder.Services.AddIdentity <User, Role>() .AddUserStore <UserStore>() .AddRoleStore <RoleStore>() .AddDefaultTokenProviders(); builder.Services.Configure <IdentityOptions>(options => { // Password options options.SignIn.RequireConfirmedPhoneNumber = false; options.SignIn.RequireConfirmedEmail = false; // User options options.User.RequireUniqueEmail = true; // Lockout options options.Lockout.AllowedForNewUsers = true; }); return(builder); }
public static ILetPortalBuilder AddPortalCors(this ILetPortalBuilder builder) { builder.Services.AddCors( option => { option.AddPolicy(PORTAL_CORS, corsBuilder => { if (builder.CorsOptions.AllowAny) { corsBuilder.AllowAnyHeader() .AllowAnyMethod() .AllowAnyOrigin() .WithExposedHeaders(builder.CorsOptions.ExposedHeaders.ToArray()); } else { if (builder.CorsOptions.AllowAnyHeader) { corsBuilder.AllowAnyHeader(); } else { corsBuilder.WithHeaders(builder.CorsOptions.AllowedHeaders.ToArray()); } if (builder.CorsOptions.AllowAnyMethod) { corsBuilder.AllowAnyMethod(); } else { corsBuilder.WithMethods(builder.CorsOptions.AllowedMethods.ToArray()); } if (builder.CorsOptions.AllowAnyHost) { corsBuilder.AllowAnyOrigin(); } else { corsBuilder.WithOrigins(builder.CorsOptions.AllowedHosts.ToArray()); } if (builder.CorsOptions.ExposedHeaders != null) { corsBuilder.WithExposedHeaders(builder.CorsOptions.ExposedHeaders.ToArray()); } } }); }); return(builder); }
public static ILetPortalBuilder AddGateway(this ILetPortalBuilder builder) { var jwtOptions = builder.Configuration.GetSection("JwtBearerOptions").Get <Core.Configurations.JwtBearerOptions>(); builder.Services .AddAuthentication( x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(AUTH_KEY, x => { x.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtOptions.Secret)), ValidIssuer = jwtOptions.Issuer, ValidAudience = jwtOptions.Audience, ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, RequireExpirationTime = true, RequireSignedTokens = true, NameClaimType = "name", // Important for testing purpose with zero but in production, it should be 5m (default) ClockSkew = Environment .GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development" ? TimeSpan.Zero : TimeSpan.FromMinutes(5) }; x.Events = new JwtBearerEvents { OnAuthenticationFailed = context => { if (context.Exception.GetType() == typeof(SecurityTokenExpiredException)) { context.Response.Headers.Add("X-Token-Expired", "true"); } else { Console.WriteLine("There are some unexpected erros while trying to validate JWT token. Exception: " + context.Exception.ToString()); } return(Task.CompletedTask); } }; }); return(builder); }
public static ILetPortalBuilder AddPortalService( this ILetPortalBuilder builder, Action <PortalOptions> action = null) { var portalOptions = new PortalOptions(); if (action != null) { action.Invoke(portalOptions); } builder.Services.Configure <MongoOptions>(builder.Configuration.GetSection("MongoOptions")); builder.Services.Configure <MapperOptions>(builder.Configuration.GetSection("MapperOptions")); builder.Services.Configure <BackupOptions>(builder.Configuration.GetSection("BackupOptions")); var mapperOptions = builder.Configuration.GetSection("MapperOptions").Get <MapperOptions>(); var databaseOptions = builder.Configuration.GetSection("DatabaseOptions").Get <DatabaseOptions>(); builder.Services.AddSingleton(mapperOptions); RegisterRepos(builder.Services, databaseOptions); if (portalOptions.EnableFileServer) { builder.Services.Configure <FilePublishOptions>(builder.Configuration.GetSection("FilePublishOptions")); builder.Services.Configure <FileOptions>(builder.Configuration.GetSection("FileOptions")); builder.Services.Configure <FileValidatorOptions>(builder.Configuration.GetSection("FileOptions").GetSection("FileValidatorOptions")); builder.Services.Configure <DiskStorageOptions>(builder.Configuration.GetSection("FileOptions").GetSection("DiskStorageOptions")); builder.Services.Configure <DatabaseStorageOptions>(builder.Configuration.GetSection("FileOptions").GetSection("DatabaseStorageOptions")); builder.Services.AddTransient <IFileConnectorExecution, DiskFileConnectorExecution>(); builder.Services.AddTransient <IFileConnectorExecution, DatabaseFileConnectorExecution>(); builder.Services.AddTransient <IFileValidatorRule, CheckFileExtensionRule>(); builder.Services.AddTransient <IFileValidatorRule, CheckFileSizeRule>(); builder.Services.AddTransient <IFileValidatorRule, CheckAllowedExtensionFileRule>(); builder.Services.AddTransient <IStoreFileDatabase, MySqlStoreFileDatabase>(); builder.Services.AddTransient <IStoreFileDatabase, SqlServerStoreFileDatabase>(); builder.Services.AddTransient <IStoreFileDatabase, PostgreStoreFileDatabase>(); builder.Services.AddTransient <IStoreFileDatabase, MongoStoreFileDatabase>(); } builder.Services.AddSingleton <ICSharpMapper, CSharpMapper>(); builder.Services.AddTransient <IDynamicQueryBuilder, DynamicQueryBuilder>(); builder.Services.AddTransient <IChartReportProjection, ChartReportProjection>(); builder.Services.AddTransient <IChartReportQueryBuilder, ChartReportQueryBuilder>(); RegisterProviders(builder.Services); RegisterServices(builder.Services); return(builder); }
public static ILetPortalBuilder AddServiceManagement(this ILetPortalBuilder builder) { var databaseOptions = builder.Configuration.GetSection("DatabaseOptions").Get <DatabaseOptions>(); builder.Services.Configure <ServiceManagementOptions>(builder.Configuration.GetSection("ServiceManagementOptions")); builder.Services.Configure <CentralizedLogOptions>(builder.Configuration.GetSection("CentralizedLogOptions")); if (databaseOptions.ConnectionType == ConnectionType.MongoDB) { builder.Services.AddSingleton <IServiceRepository, ServiceMongoRepository>(); builder.Services.AddSingleton <ILogEventRepository, LogEventMongoRepository>(); builder.Services.AddSingleton <IMonitorCounterRepository, MonitorCounterMongoRepository>(); builder.Services.AddSingleton <IMonitorHardwareReportRepository, MonitorHardwareReportMongoRepository>(); builder.Services.AddSingleton <IMonitorHttpReportRepository, MonitorHttpReportMongoRepository>(); } if (databaseOptions.ConnectionType == ConnectionType.SQLServer || databaseOptions.ConnectionType == ConnectionType.PostgreSQL || databaseOptions.ConnectionType == ConnectionType.MySQL) { builder.Services.AddTransient <LetPortalServiceManagementDbContext>(); builder.Services.AddTransient <IServiceRepository, ServiceEFRepository>(); builder.Services.AddTransient <ILogEventRepository, LogEventEFRepository>(); builder.Services.AddTransient <IMonitorCounterRepository, MonitorCounterEFRepository>(); builder.Services.AddTransient <IMonitorHardwareReportRepository, MonitorHardwareReportEFRepository>(); builder.Services.AddTransient <IMonitorHttpReportRepository, MonitorHttpReportEFRepository>(); } builder.Services.AddSingleton <IServiceManagementProvider, ServiceManagamentProvider>(); builder.Services.AddSingleton <IMonitorServiceReportProvider, MonitorServiceReportProvider>(); builder.Services.AddSingleton <ILogEventProvider, LogEventProvider>(); builder.Services.AddSingleton <IMonitorProvider, MonitorProvider>(); builder.Services.AddHostedService <CheckingLostServicesBackgroundTask>(); builder.Services.AddHostedService <CheckingShutdownServicesBackgroundTask>(); builder.Services.AddHostedService <GatherAllHardwareCounterServicesBackgroundTask>(); return(builder); }
public static ILetPortalBuilder AddChat(this ILetPortalBuilder builder) { var services = builder.Services; services.AddSingleton <IChatContext, ChatContext>(); services.AddSingleton <IVideoContext, VideoContext>(); if (builder.ConnectionType == ConnectionType.MongoDB) { MongoDbRegistry.RegisterEntities(); builder.Services.AddSingleton <IChatRoomRepository, ChatRoomMongoRepository>(); builder.Services.AddSingleton <IChatSessionRepository, ChatSessionMongoRepository>(); builder.Services.AddSingleton <IChatUserRepository, ChatUserMongoRepository>(); } if (builder.ConnectionType == ConnectionType.PostgreSQL || builder.ConnectionType == ConnectionType.MySQL || builder.ConnectionType == ConnectionType.SQLServer) { builder.Services.AddTransient <ChatDbContext>(); builder.Services.AddTransient <IChatRoomRepository, ChatRoomEFRepository>(); builder.Services.AddTransient <IChatSessionRepository, ChatSessionEFRepository>(); builder.Services.AddTransient <IChatUserRepository, ChatUserEFRepository>(); } builder.Services.Configure <ChatOptions>(builder.Configuration.GetSection("ChatOptions")); builder.Services.Configure <VideoCallOptions>(builder.Configuration.GetSection("VideoCallOptions")); var chatOptions = builder.Configuration.GetSection("ChatOptions").Get <ChatOptions>(); services.AddCors(options => { options.AddPolicy(CHAT_POLICY_CORS, corsBuilder => { corsBuilder .AllowAnyMethod() .AllowAnyHeader() .WithOrigins(builder.CorsOptions.AllowedHosts.ToArray()) .AllowCredentials() .WithExposedHeaders(LetPortal.Core.Constants.TokenExpiredHeader); }); }); services.AddTransient(typeof(HubChatClient), serviceProvider => { return(new HubChatClient( serviceProvider.GetService <IChatContext>(), serviceProvider.GetService <IChatRoomRepository>(), serviceProvider.GetService <IChatSessionRepository>(), serviceProvider.GetService <IChatUserRepository>(), serviceProvider.GetService <IOptionsMonitor <ChatOptions> >(), serviceProvider.GetService <IServiceLogger <HubChatClient> >())); }); services.AddTransient(typeof(HubVideoClient), serviceProvider => { return(new HubVideoClient( serviceProvider.GetService <IVideoContext>(), serviceProvider.GetService <IOptionsMonitor <VideoCallOptions> >())); }); return(builder); }
public static ILetPortalBuilder AddJwtValidator(this ILetPortalBuilder builder, Configurations.JwtBearerOptions jwtOptions = null, List <string> hubSegments = null) { if (jwtOptions == null) { builder.Services.Configure <Core.Configurations.JwtBearerOptions>(builder.Configuration.GetSection("JwtBearerOptions")); jwtOptions = builder.Configuration.GetSection("JwtBearerOptions").Get <Core.Configurations.JwtBearerOptions>(); } builder.Services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(x => { x.RequireHttpsMetadata = Environment .GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Production"; x.SaveToken = true; x.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtOptions.Secret)), ValidIssuer = jwtOptions.Issuer, ValidAudience = jwtOptions.Audience, ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, RequireExpirationTime = true, RequireSignedTokens = true, // Be careful, if we use 'sub' as username, so we need to set http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier // Because .NET Core Identity will map sub -> nameidentifier NameClaimType = ClaimTypes.NameIdentifier, // Important for testing purpose with zero but in production, it should be 5m (default) ClockSkew = Environment .GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development" ? TimeSpan.Zero : TimeSpan.FromMinutes(5) }; x.Events = new JwtBearerEvents { OnMessageReceived = context => { // If the request is for our hub... var path = context.HttpContext.Request.Path; if (hubSegments != null && hubSegments.Any(url => (path.StartsWithSegments(url, StringComparison.OrdinalIgnoreCase)))) { var accessToken = context.Request.Query["access_token"]; if (!string.IsNullOrEmpty(accessToken)) { // Read the token out of the query string context.Token = accessToken; } } else if (context.HttpContext.Request.Headers.ContainsKey("Authorization")) { // Keep read from Authorization header var authToken = context.HttpContext.Request.GetJwtToken(); context.Token = authToken.RawData; } return(Task.CompletedTask); }, OnAuthenticationFailed = context => { if (context.Exception.GetType() == typeof(SecurityTokenExpiredException)) { context.Response.Headers.Add("X-Token-Expired", "true"); } else { Console.WriteLine("There are some unexpected erros while trying to validate JWT token. Exception: " + context.Exception.ToString()); } return(Task.CompletedTask); } }; }); return(builder); }