示例#1
0
        public HostedSolution(
            IConfiguration configuration,
            ConnectionStringSettings connectionString,
            TariffServiceStorage tariffServiceStorage,
            IOptionsMonitor <ILog> options,
            TenantUtil tenantUtil,
            TenantDomainValidator tenantDomainValidator,
            TenantDbContext tenantDbContext,
            UserDbContext userDbContext,
            CoreDbContext coreDbContext,
            string region)
        {
            tenantService = new DbTenantService(tenantDbContext, tenantDomainValidator);
            var baseSettings = new CoreBaseSettings(configuration);

            coreSettings = new CoreSettings(tenantService, baseSettings, configuration);

            userService         = new EFUserService(userDbContext);
            quotaService        = new DbQuotaService(coreDbContext);
            tariffService       = new TariffService(quotaService, tenantService, baseSettings, coreSettings, configuration, coreDbContext, tariffServiceStorage, options);
            clientTenantManager = new TenantManager(tenantService, quotaService, tariffService, null, baseSettings, coreSettings);
            settingsManager     = new DbSettingsManager(connectionString);
            TenantUtil          = tenantUtil;
            Region = region ?? string.Empty;
        }
        public static void RefreshKeys(string metadataLocation)
        {
            IssuingAuthority issuingAuthority = ValidatingIssuerNameRegistry.GetIssuingAuthority(metadataLocation);

            bool newKeys = false;

            foreach (string thumbprint in issuingAuthority.Thumbprints)
            {
                if (!ContainsKey(thumbprint))
                {
                    newKeys = true;
                    break;
                }
            }

            if (newKeys)
            {
                using (TenantDbContext context = new TenantDbContext())
                {
                    context.IssuingAuthorityKeys.RemoveRange(context.IssuingAuthorityKeys);
                    foreach (string thumbprint in issuingAuthority.Thumbprints)
                    {
                        context.IssuingAuthorityKeys.Add(new IssuingAuthorityKey {
                            Id = thumbprint
                        });
                    }
                    context.SaveChanges();
                }
            }
        }
示例#3
0
        public void SetTenantSettings(int tenant, string key, byte[] data)
        {
            using var tx = TenantDbContext.Database.BeginTransaction();

            if (data == null || data.Length == 0)
            {
                var settings = TenantDbContext.CoreSettings
                               .Where(r => r.Tenant == tenant)
                               .Where(r => r.Id == key)
                               .FirstOrDefault();

                if (settings != null)
                {
                    TenantDbContext.CoreSettings.Remove(settings);
                }
            }
            else
            {
                var settings = new DbCoreSettings
                {
                    Id     = key,
                    Tenant = tenant,
                    Value  = data
                };
                TenantDbContext.CoreSettings.Add(settings);
            }
            TenantDbContext.SaveChanges();
            tx.Commit();
        }
示例#4
0
        static void Data_Seeding_Tenants(TenantDbContext tenantDbContext)
        {
            if (!tenantDbContext.Tenants.Any())
            {
                var tenant = new AppTenant()
                {
                    CacheDuration           = 600,
                    CreateDate              = DateTime.UtcNow,
                    IdentityServerIssuerUri = Tenant.IdentityServerIssuerUri,
                    LastUpdateTime          = DateTime.UtcNow,
                    Name        = Tenant.Name,
                    OwnerUserId = AppConstant.seedUserId, //默认设置为1
                    Status      = TenantStatus.Enable,
                    Theme       = "default"
                };

                tenant.Hosts.Add(new AppTenantHost()
                {
                    HostName = Tenant.AppHostName
                });

                tenant.Properties.AddRange(Tenant.TenantProperties.Select(x => new AppTenantProperty()
                {
                    Key   = x.Key,
                    Value = x.Value
                }));

                tenantDbContext.Tenants.Add(tenant);
                tenantDbContext.SaveChanges();
            }
        }
示例#5
0
        public void RemoveTenant(int id, bool auto = false)
        {
            var postfix = auto ? "_auto_deleted" : "_deleted";

            using var tx = TenantDbContext.Database.BeginTransaction();

            var alias = TenantDbContext.Tenants
                        .Where(r => r.Id == id)
                        .Select(r => r.Alias)
                        .FirstOrDefault();

            var count = TenantDbContext.Tenants
                        .Where(r => r.Alias.StartsWith(alias + postfix))
                        .Count();

            var tenant = TenantDbContext.Tenants.Where(r => r.Id == id).FirstOrDefault();

            if (tenant != null)
            {
                tenant.Alias         = alias + postfix + (count > 0 ? count.ToString() : "");
                tenant.Status        = TenantStatus.RemovePending;
                tenant.StatusChanged = DateTime.UtcNow;
                tenant.LastModified  = DateTime.UtcNow;
            }

            TenantDbContext.SaveChanges();

            tx.Commit();
        }
        public static void RefreshKeys(string metadataLocation)
        {
            IssuingAuthority issuingAuthority = ValidatingIssuerNameRegistry.GetIssuingAuthority(metadataLocation);

            bool newKeys       = false;
            bool refreshTenant = false;

            foreach (string thumbprint in issuingAuthority.Thumbprints)
            {
                if (!ContainsKey(thumbprint))
                {
                    newKeys       = true;
                    refreshTenant = true;
                    break;
                }
            }

            foreach (string issuer in issuingAuthority.Issuers)
            {
                if (!ContainsTenant(GetIssuerId(issuer)))
                {
                    refreshTenant = true;
                    break;
                }
            }

            if (newKeys || refreshTenant)
            {
                using (TenantDbContext context = new TenantDbContext())
                {
                    if (newKeys)
                    {
                        context.IssuingAuthorityKeys.RemoveRange(context.IssuingAuthorityKeys);
                        foreach (string thumbprint in issuingAuthority.Thumbprints)
                        {
                            context.IssuingAuthorityKeys.Add(new IssuingAuthorityKey {
                                Id = thumbprint
                            });
                        }
                    }

                    if (refreshTenant)
                    {
                        // Add the default tenant to the registry.
                        // Comment or remove the following code if you do not wish to have the default tenant use the application.
                        foreach (string issuer in issuingAuthority.Issuers)
                        {
                            string issuerId = GetIssuerId(issuer);
                            if (!ContainsTenant(issuerId))
                            {
                                context.Tenants.Add(new Tenant {
                                    Id = issuerId
                                });
                            }
                        }
                    }
                    context.SaveChanges();
                }
            }
        }
 public UserController(
     UserDbContext _db,
     RedisService _redis,
     IStringLocalizer <UserController> _localizer,
     ISmsSender _sms,
     EmailService _email,
     UserManager <AppUser> _userManager,
     TenantDbContext _tenantDbContext,
     ConfigurationDbContext _configDbContext,
     IDataProtectionProvider _provider,
     TenantService _tenantService,
     IdentityServer4MicroServiceOptions _ismsOptions)
 {
     // 多语言
     l               = _localizer;
     db              = _db;
     redis           = _redis;
     sms             = _sms;
     email           = _email;
     userManager     = _userManager;
     tenantDbContext = _tenantDbContext;
     configDbContext = _configDbContext;
     protector       = _provider.CreateProtector(GetType().FullName).ToTimeLimitedDataProtector();
     tenantService   = _tenantService;
     ismsOptions     = _ismsOptions;
 }
        public static bool TryAddTenant(string tenantId, string signupToken)
        {
            if (!ContainsTenant(tenantId))
            {
                using (TenantDbContext context = new TenantDbContext())
                {
                    if (tenantId == signupToken)
                    {
                        context.Tenants.Add(new TenantRegistrationModels.Tenant {
                            Id = tenantId
                        });
                        context.SaveChanges();
                        return(true);
                    }
                    else
                    {
                        TenantRegistrationModels.SignupToken existingToken = context.SignupTokens.Where(token => token.Id == signupToken).FirstOrDefault();
                        if (existingToken != null)
                        {
                            context.SignupTokens.Remove(existingToken);
                            context.Tenants.Add(new TenantRegistrationModels.Tenant {
                                Id = tenantId
                            });
                            context.SaveChanges();
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
 public static bool ContainsTenant(string tenantId)
 {
     using (TenantDbContext context = new TenantDbContext())
     {
         return(context.Tenants.Where(tenant => tenant.Id == tenantId).Any());
     }
 }
示例#10
0
        public AccountController(
            IIdentityServerInteractionService interaction,
            IHttpContextAccessor httpContextAccessor,
            UserManager <AppUser> userManager,
            SignInManager <AppUser> signInManager,
            EmailService emailSender,
            ISmsSender smsSender,
            IdentityDbContext userContext,
            ConfigurationDbContext configDbContext,
            TenantService _tenantService,
            TenantDbContext _tenantDb,
            ILogger <AccountController> _logger)
        {
            _userManager   = userManager;
            _signInManager = signInManager;
            _emailSender   = emailSender;
            _smsSender     = smsSender;

            _account         = new AccountService(interaction, httpContextAccessor);
            _userContext     = userContext;
            _configDbContext = configDbContext;

            tenantService = _tenantService;
            tenantDb      = _tenantDb;
            logger        = _logger;
        }
示例#11
0
 public ValuesController(TenantDbContext tenantDbContext, IHttpContextAccessor httpContextAccessor)
 {
     _tenantDbContext = tenantDbContext;
     if (httpContextAccessor.HttpContext != null)
     {
         _tenant = (Tenant)httpContextAccessor.HttpContext.Items["TENANT"];
     }
 }
 public TenantService(
     TenantDbContext context,
     ILogger <TenantService> logger
     )
 {
     _context = context;
     _logger  = logger;
 }
示例#13
0
 public static bool ContainsKey(string thumbprint)
 {
     using (TenantDbContext context = new TenantDbContext()) {
         return(context.IssuingAuthorityKeys
                .Where(key => key.Id == thumbprint)
                .Any());
     }
 }
        public DataBaseTenantProvider(TenantDbContext context, IHttpContextAccessor httpContextAccessor)
        {
            var host = httpContextAccessor.HttpContext?.Request.Host.Value;

            if (!string.IsNullOrEmpty(host))
            {
                _tenantId = context.Tenants.First(f => f.Host.Equals(host)).Id;
            }
        }
        public BaseController(IHttpContextAccessor httpContext, ITenantDbFactory dbFactory)
        {
            Tenant = httpContext.HttpContext.GetTenant();

            if (Tenant != null)
            {
                Context = dbFactory.GetTenantDatabase(Tenant.DbName);
            }
        }
示例#16
0
 public CustomerService(
     IDbContextFactory <TenantDbContext, int> tenantDbContextFactory,
     IScopedCache scopedCache,
     IMapper mapper)
 {
     _scopedCache     = scopedCache;
     _mapper          = mapper;
     _tenantDbContext = tenantDbContextFactory.Create(_scopedCache.TenantId);
 }
示例#17
0
 public DataController(ILogger <DataController> logger, TenantDbContext tenantDbContext, IDatabaseRepository databaseRepository, IHttpContextAccessor httpContextAccessor)
 {
     _logger          = logger;
     _tenantDbContext = tenantDbContext;
     if (httpContextAccessor.HttpContext != null)
     {
         _tenant             = (Tenant)httpContextAccessor.HttpContext.Items["TENANT"];
         _databaseRepository = new DatabaseRepository(_tenantDbContext);
     }
 }
 public TenantDatabaseInitializer(
     //int tenantId,
     TenantDbContext context, //NOTE: get specific context (string tenantName),
     IAccountManager accountManager,
     ILogger <TenantDatabaseInitializer> logger)
 {
     _accountManager = accountManager;
     _context        = context; //_context = new TenantDbContext(tenantId);
     _logger         = logger;
 }
        public IActionResult Index()
        {
            using (var ctx = new TenantDbContext(_httpContextAccessor, _tenantHelper))
            {
                ViewBag.Orders = ctx.Orders.ToList();
                //ViewBag.Orders = _orderRepository.GetAll().ToList();
            }

            return(View());
        }
示例#20
0
 public ToolController(
     ILogger <ConsentController> _logger,
     IStringLocalizer <ToolController> _l,
     TenantService _tenantService,
     TenantDbContext _tenantDb)
 {
     tenantService = _tenantService;
     tenantDb      = _tenantDb;
     logger        = _logger;
     l             = _l;
 }
示例#21
0
        public void TenancyQueryTest()
        {
            var tenantId = 1;

            using (TenantDbContext.ContextCreated.OfType <TenantDbContext>().Subscribe(db => db.TenantId = tenantId))
            {
                tenantId = 1;
                using (var db = new TenantDbContext())
                {
                    db.Items.Add(new TestItem {
                        Description = "1"
                    });
                    db.SaveChanges();
                }

                tenantId = 2;
                using (var db = new TenantDbContext())
                {
                    db.Items.Add(new TestItem {
                        Description = "2"
                    });
                    db.SaveChanges();
                }

                tenantId = 1;
                using (var db = new TenantDbContext())
                {
                    var e = db.Items.ToList().First();
                    e.Should().NotBeNull("Item 1 not found");
                    e.Description.Should().Be("1");
                    e.TenantId.Should().Be(1);
                }

                tenantId = 2;
                using (var db = new TenantDbContext())
                {
                    var e = db.Items.ToList().First();
                    e.Should().NotBeNull("Item 2 not found");
                    e.Description.Should().Be("2");
                    e.TenantId.Should().Be(2);
                }

                using (var db = new TenantDbContext())
                {
                    db
                    .Items
                    .IgnoreQueryFilters()
                    .ToList()
                    .Count
                    .Should()
                    .Be(2);
                }
            }
        }
 public static void AddSignupToken(string signupToken, DateTimeOffset expirationTime)
 {
     using (TenantDbContext context = new TenantDbContext())
     {
         context.SignupTokens.Add(new SignupToken
         {
             Id             = signupToken,
             ExpirationDate = expirationTime
         });
         context.SaveChanges();
     }
 }
示例#23
0
 public ConsentController(
     IIdentityServerInteractionService interaction,
     IClientStore clientStore,
     IResourceStore resourceStore,
     ILogger <ConsentController> logger,
     TenantService _tenantService,
     TenantDbContext _tenantDb)
 {
     _consent      = new ConsentService(interaction, clientStore, resourceStore, logger);
     tenantService = _tenantService;
     tenantDb      = _tenantDb;
 }
 public HomeController(
     IStringLocalizer <HomeController> _l,
     TenantService _tenantService,
     TenantDbContext _tenantDb,
     SignInManager <AppUser> _signInManager
     )
 {
     l             = _l;
     tenantService = _tenantService;
     tenantDb      = _tenantDb;
     signInManager = _signInManager;
 }
 public TenantController(
     TenantDbContext _db,
     RedisService _redis,
     IStringLocalizer <TenantController> _localizer,
     TenantService _tenantService
     )
 {
     // 多语言
     l             = _localizer;
     redis         = _redis;
     tenantDb      = _db;
     tenantService = _tenantService;
 }
示例#26
0
 public HostedSolution(
     IConfiguration configuration,
     ConnectionStringSettings connectionString,
     TariffServiceStorage tariffServiceStorage,
     IOptionsMonitor <ILog> options,
     TenantUtil tenantUtil,
     TenantDomainValidator tenantDomainValidator,
     TenantDbContext tenantDbContext,
     UserDbContext userDbContext,
     CoreDbContext coreDbContext)
     : this(configuration, connectionString, tariffServiceStorage, options, tenantUtil, tenantDomainValidator, tenantDbContext, userDbContext, coreDbContext, null)
 {
 }
示例#27
0
        /// <summary>
        /// Handle
        /// </summary>
        /// <returns></returns>
        public Response Handle()
        {
            _query.Query(_dbContext).All().ForEach((connection) =>
            {
                var optionBuilder = new DbContextOptionsBuilder <TenantDbContext>();
                optionBuilder.UseSqlServer(connection.ConnectionString);

                var dbContext = new TenantDbContext(optionBuilder.Options);
                RelationalDatabaseFacadeExtensions.Migrate(dbContext.Database);
            });

            return(new Response());
        }
        public static void RefreshKeys(string metadataLocation)
        {
            var issuingAuthority = GetIssuingAuthority(metadataLocation);

            var newKeys       = false;
            var refreshTenant = false;

            if (issuingAuthority.Thumbprints.Any(thumbprint => !ContainsKey(thumbprint)))
            {
                newKeys       = true;
                refreshTenant = true;
            }

            if (issuingAuthority.Issuers.Any(issuer => !ContainsTenant(GetIssuerId(issuer))))
            {
                refreshTenant = true;
            }

            if (!newKeys && !refreshTenant)
            {
                return;
            }
            using (var context = new TenantDbContext())
            {
                if (newKeys)
                {
                    context.IssuingAuthorityKeys.RemoveRange(context.IssuingAuthorityKeys);
                    foreach (var thumbprint in issuingAuthority.Thumbprints)
                    {
                        context.IssuingAuthorityKeys.Add(new IssuingAuthorityKey {
                            Id = thumbprint
                        });
                    }
                }

                if (refreshTenant)
                {
                    foreach (var issuer in issuingAuthority.Issuers)
                    {
                        var issuerId = GetIssuerId(issuer);
                        if (!ContainsTenant(issuerId))
                        {
                            context.Tenants.Add(new Tenant {
                                Id = issuerId
                            });
                        }
                    }
                }
                context.SaveChanges();
            }
        }
        public static void CleanUpExpiredSignupTokens()
        {
            DateTimeOffset now = DateTimeOffset.UtcNow;

            using (TenantDbContext context = new TenantDbContext())
            {
                IQueryable <SignupToken> tokensToRemove = context.SignupTokens.Where(token => token.ExpirationDate <= now);
                if (tokensToRemove.Any())
                {
                    context.SignupTokens.RemoveRange(tokensToRemove);
                    context.SaveChanges();
                }
            }
        }
示例#30
0
        public void SaveTest()
        {
            using (TenantDbContext.ContextCreated.OfType <TenantDbContext>().Subscribe(db => db.TenantId = 1))
            {
                using (var db = new TenantDbContext())
                {
                    var entry = db.Items.Add(new TestItem {
                        Description = "Test"
                    });
                    db.SaveChanges();

                    entry.Entity.TenantId.Should().Be(1);
                }
            }
        }