protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes); Settings.ConnectionString = ConfigurationManager.AppSettings["ConnectionString"]; DatabaseMigrator.MigrateDatabase(); ServiceFactory.Bootstrap(); }
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); //初始化实体 ServiceInitializer.RegisterEntities(); DatabaseMigrator <EfDbContext, EfConfiguration> .MigrateDatabase(); RegisterService(); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var authenticationConfiguration = new AuthenticationConfiguration() { LoginUrl = Configuration.GetValue <string>("authentication:loginUrl"), LogoutUrl = Configuration.GetValue <string>("authentication:logoutUrl"), CookieName = Configuration.GetValue <string>("authentication:cookieName"), Key = Configuration.GetValue <string>("authentication:key"), KeyPassword = Configuration.GetValue <string>("authentication:keyPassword") }; services.AddSingleton(authenticationConfiguration); var emailConfiguration = new EmailConfiguration() { FromEmailAddress = Configuration.GetValue <string>("email:fromEmailAddress"), FromEmailName = Configuration.GetValue <string>("email:fromEmailName"), EmailVerificationUrl = Configuration.GetValue <string>("email:emailVerificationUrl"), }; services.AddSingleton(emailConfiguration); var sendGridConfiguration = new SendGridConfiguration() { ApiKey = Configuration.GetValue <string>("sendGrid:apiKey"), }; services.AddSingleton(sendGridConfiguration); DatabaseMigrator.MigrateDatabase(Configuration.GetDatabaseConnectionString()); services.AddDbContext <CloakedDaggerDbContext>(options => { options.UseNpgsql(Configuration.GetDatabaseConnectionString()); }); services.AddTransient <IUserRepository, UserRepository>(); services.AddTransient <IRoleRepository, RoleRepository>(); services.AddTransient <IUserRoleRepository, UserRoleRepository>(); services.AddTransient <IUserRegistrationKeyRepository, UserRegistrationKeyRepository>(); services.AddTransient <IUserRegistrationKeyUseRepository, UserRegistrationKeyUseRepository>(); services.AddTransient <IUserEmailVerificationRequestRepository, UserEmailVerificationRequestRepository>(); services.AddTransient <IResourceRepository, ResourceRepository>(); services.AddTransient <IResourceScopeRepository, ResourceScopeRepository>(); services.AddTransient <IScopeRepository, ScopeRepository>(); services.AddTransient <IClientRepository, ClientRepository>(); services.AddTransient <IClientEventRepository, ClientEventRepository>(); services.AddTransient <IPersistedGrantRepository, PersistedGrantRepository>(); services.AddTransient <ILoginService, LoginService>(); services.AddTransient <IUserService, UserService>(); services.AddTransient <IUserRegistrationKeyService, UserRegistrationKeyService>(); services.AddTransient <IResourceService, ResourceService>(); services.AddTransient <IResourceScopeService, ResourceScopeService>(); services.AddTransient <IClientService, ClientService>(); services.AddTransient <IPasswordHasher, ArgonPasswordHasher>(); //Email Stuff services.AddTransient <IEmailSender, SendGridEmailSender>(); services.AddTransient <IEmailService, EmailService>(); var entityMapperConfig = new MapperConfiguration(config => { config.CreateMap <ResourceScopeEntity, ResourceScopeViewModel>() .ForMember(vm => vm.Name, cfg => cfg.MapFrom(rs => rs.ScopeEntity.Name) ) .ForMember(vm => vm.Description, cfg => cfg.MapFrom(rs => rs.ScopeEntity.Description) ); config.CreateMap <ResourceEntity, ResourceViewModel>(); config.CreateMap <UserRegistrationKeyEntity, UserRegistrationKeyViewModel>(); }); var entityMapper = new Mapper(entityMapperConfig); services.AddSingleton <IMapper>(entityMapper); services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.Converters.Add(new JsonDateEpochConverter()); options.SerializerSettings.Converters.Add( new MapperJsonConverter <ResourceEntity, ResourceViewModel>(entityMapper)); options.SerializerSettings.Converters.Add(new MapperJsonConverter <ResourceScopeEntity, ResourceScopeViewModel>(entityMapper)); options.SerializerSettings.Converters.Add(new MapperJsonConverter <UserRegistrationKeyEntity, UserRegistrationKeyViewModel>(entityMapper)); }); services.AddSingleton(Log.Logger); // Identity Server / OAuth2 var isBuilder = services.AddIdentityServer(options => { options.UserInteraction.LoginUrl = authenticationConfiguration.LoginUrl; }) .AddClientStore <ClientStoreAdapter>() .AddResourceStore <ResourceStoreAdapter>() .AddPersistedGrantStore <PersistedGrantStoreAdapter>() .AddProfileService <ProfileServiceAdapter>(); if (string.IsNullOrWhiteSpace(authenticationConfiguration.Key)) { isBuilder.AddDeveloperSigningCredential(); } else { isBuilder.AddSigningCredential(LoadAuthenticationSigningKey(authenticationConfiguration)); } // Add this after we configure Identity Server, otherwise it overrides the settings or at least the // OnRedirectToLogin handler services.AddAuthentication(CloakedDaggerAuthenticationSchemes.Default) .AddCookie(CloakedDaggerAuthenticationSchemes.Default, options => { options.LogoutPath = authenticationConfiguration.LogoutUrl; options.Cookie.Name = authenticationConfiguration.CookieName; options.Events.OnRedirectToLogin = context => { // Don't want it to redirect to a different URL when not logged in, just return a 401 context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; return(Task.CompletedTask); }; options.Events.OnRedirectToAccessDenied = context => { context.Response.StatusCode = (int)HttpStatusCode.Forbidden; return(Task.CompletedTask); }; }) .AddCookie(CloakedDaggerAuthenticationSchemes.Partial, options => { options.LogoutPath = authenticationConfiguration.LogoutUrl; options.Cookie.Name = $"{authenticationConfiguration.CookieName}__{CloakedDaggerAuthenticationSchemes.Partial}"; options.Events.OnRedirectToLogin = context => { // Don't want it to redirect to a different URL when not logged in, just return a 401 context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; return(Task.CompletedTask); }; options.Events.OnRedirectToAccessDenied = context => { context.Response.StatusCode = (int)HttpStatusCode.Forbidden; return(Task.CompletedTask); }; }); }