예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
        }