示例#1
0
    private async Task SetCacheItemsAsync(
        string providerName,
        string providerKey,
        string currentName,
        SettingCacheItem currentCacheItem)
    {
        var settingDefinitions = SettingDefinitionManager.GetAll();
        var settingsDictionary = (await SettingRepository.GetListAsync(providerName, providerKey))
                                 .ToDictionary(s => s.Name, s => s.Value);

        var cacheItems = new List <KeyValuePair <string, SettingCacheItem> >();

        foreach (var settingDefinition in settingDefinitions)
        {
            var settingValue = settingsDictionary.GetOrDefault(settingDefinition.Name);

            cacheItems.Add(
                new KeyValuePair <string, SettingCacheItem>(
                    CalculateCacheKey(settingDefinition.Name, providerName, providerKey),
                    new SettingCacheItem(settingValue)
                    )
                );

            if (settingDefinition.Name == currentName)
            {
                currentCacheItem.Value = settingValue;
            }
        }

        await Cache.SetManyAsync(cacheItems, considerUow : true);
    }
示例#2
0
        protected virtual ListResultDto <SettingDto> GetAllSetting(
            List <SettingValue> settings)
        {
            var settingsDto = new List <SettingDto>();

            foreach (var setting in settings)
            {
                var settingDefinition = SettingDefinitionManager.Get(setting.Name);

                if (!settingDefinition.IsVisibleToClients)
                {
                    continue;
                }
                var settingInfo = new SettingDto
                {
                    Name         = setting.Name,
                    Value        = setting.Value,
                    DefaultValue = settingDefinition.DefaultValue,
                    Description  = settingDefinition.Description.Localize(StringLocalizerFactory),
                    DisplayName  = settingDefinition.DisplayName.Localize(StringLocalizerFactory)
                };
                settingsDto.Add(settingInfo);
            }
            return(new ListResultDto <SettingDto>(settingsDto));
        }
示例#3
0
        protected virtual async Task <CodeZeroUserSettingConfigDto> GetUserSettingConfig()
        {
            var config = new CodeZeroUserSettingConfigDto
            {
                Values = new Dictionary <string, string>()
            };

            var settingDefinitions = SettingDefinitionManager
                                     .GetAllSettingDefinitions();

            using (var scope = _iocResolver.CreateScope())
            {
                foreach (var settingDefinition in settingDefinitions)
                {
                    if (!await settingDefinition.ClientVisibilityProvider.CheckVisible(scope))
                    {
                        continue;
                    }

                    var settingValue = await SettingManager.GetSettingValueAsync(settingDefinition.Name);

                    config.Values.Add(settingDefinition.Name, settingValue);
                }
            }

            return(config);
        }
示例#4
0
        private async Task <List <KeyValuePair <string, SettingCacheItem> > > SetCacheItemsAsync(
            string providerName,
            string providerKey,
            List <string> notCacheKeys)
        {
            var settingDefinitions = SettingDefinitionManager.GetAll().Where(x => notCacheKeys.Any(k => GetSettingNameFormCacheKeyOrNull(k) == x.Name));

            var settingsDictionary = (await SettingRepository.GetListAsync(notCacheKeys.Select(GetSettingNameFormCacheKeyOrNull).ToArray(), providerName, providerKey))
                                     .ToDictionary(s => s.Name, s => s.Value);

            var cacheItems = new List <KeyValuePair <string, SettingCacheItem> >();

            foreach (var settingDefinition in settingDefinitions)
            {
                var settingValue = settingsDictionary.GetOrDefault(settingDefinition.Name);
                cacheItems.Add(
                    new KeyValuePair <string, SettingCacheItem>(
                        CalculateCacheKey(settingDefinition.Name, providerName, providerKey),
                        new SettingCacheItem(settingValue)
                        )
                    );
            }

            await Cache.SetManyAsync(cacheItems, considerUow : true);

            return(cacheItems);
        }
示例#5
0
        protected virtual async Task <AbpUserSettingConfigDto> GetUserSettingConfig()
        {
            var config = new AbpUserSettingConfigDto
            {
                Values = new Dictionary <string, string>()
            };

            var settings = await SettingManager.GetAllSettingValuesAsync(SettingScopes.All);

            using (var scope = _iocResolver.CreateScope())
            {
                foreach (var settingValue in settings)
                {
                    if (!await SettingDefinitionManager.GetSettingDefinition(settingValue.Name).ClientVisibilityProvider
                        .CheckVisible(scope))
                    {
                        continue;
                    }

                    config.Values.Add(settingValue.Name, settingValue.Value);
                }
            }

            return(config);
        }
示例#6
0
        protected virtual async Task <ListResultDto <SettingDto> > GetAllSettingAsync(
            string providerName, string providerKey)
        {
            var settingsDto        = new List <SettingDto>();
            var settingDefinitions = SettingDefinitionManager.GetAll();

            foreach (var setting in settingDefinitions)
            {
                if (setting.Providers.Any() && !setting.Providers.Contains(providerName))
                {
                    continue;
                }

                if (!setting.IsVisibleToClients)
                {
                    continue;
                }

                var settingValue = await SettingManager.GetOrNullAsync(setting.Name, providerName, providerKey);

                var settingInfo = new SettingDto
                {
                    Name         = setting.Name,
                    Value        = settingValue,
                    DefaultValue = setting.DefaultValue,
                    Description  = setting.Description.Localize(StringLocalizerFactory),
                    DisplayName  = setting.DisplayName.Localize(StringLocalizerFactory)
                };
                settingsDto.Add(settingInfo);
            }
            return(new ListResultDto <SettingDto>(settingsDto));
        }
示例#7
0
    public virtual async Task <List <SettingValue> > GetAllAsync()
    {
        var settingValues      = new List <SettingValue>();
        var settingDefinitions = SettingDefinitionManager.GetAll();

        foreach (var setting in settingDefinitions)
        {
            settingValues.Add(new SettingValue(setting.Name, await GetOrNullAsync(setting.Name)));
        }

        return(settingValues);
    }
示例#8
0
        public virtual async Task SetAsync(string name, string value, string providerName, string providerKey, bool forceToSet = false)
        {
            Check.NotNull(name, nameof(name));
            Check.NotNull(providerName, nameof(providerName));

            var setting = SettingDefinitionManager.Get(name);

            var providers = Enumerable
                            .Reverse(Providers)
                            .SkipWhile(p => p.Name != providerName)
                            .ToList();

            if (!providers.Any())
            {
                return;
            }

            if (setting.IsEncrypted)
            {
                value = SettingEncryptionService.Encrypt(setting, value);
            }

            if (providers.Count > 1 && !forceToSet && setting.IsInherited && value != null)
            {
                var fallbackValue = await GetOrNullInternalAsync(name, providers[1].Name, null).ConfigureAwait(false);

                if (fallbackValue == value)
                {
                    //Clear the value if it's same as it's fallback value
                    value = null;
                }
            }

            providers = providers
                        .TakeWhile(p => p.Name == providerName)
                        .ToList(); //Getting list for case of there are more than one provider with same providerName

            if (value == null)
            {
                foreach (var provider in providers)
                {
                    await provider.ClearAsync(setting, providerKey).ConfigureAwait(false);
                }
            }
            else
            {
                foreach (var provider in providers)
                {
                    await provider.SetAsync(setting, value, providerKey).ConfigureAwait(false);
                }
            }
        }
        protected async Task UpdateAsync(UpdateSettingsInput input)
        {
            var navigation         = SettingDefinitionManager.GetNavigation(input.NavigationName);
            var settingDefinitions = navigation.SettingDefinitions;
            var settings           = input.CustomizedFields.Where(s =>
                                                                  settingDefinitions.Select(sd => sd.Name).Contains(s.Key)
                                                                  );

            foreach (var setting in settings)
            {
                await UpdateAsync(setting.Key, setting.Value.ToString());
            }
        }
示例#10
0
 public AbpApplicationConfigurationAppService(
     IOptions <AbpLocalizationOptions> localizationOptions,
     IServiceProvider serviceProvider,
     IAbpAuthorizationPolicyProvider abpAuthorizationPolicyProvider,
     IAuthorizationService authorizationService,
     ICurrentUser currentUser,
     ISettingProvider settingProvider,
     SettingDefinitionManager settingDefinitionManager)
 {
     _serviceProvider = serviceProvider;
     _abpAuthorizationPolicyProvider = abpAuthorizationPolicyProvider;
     _authorizationService           = authorizationService;
     _currentUser              = currentUser;
     _settingProvider          = settingProvider;
     _settingDefinitionManager = settingDefinitionManager;
     _localizationOptions      = localizationOptions.Value;
 }
示例#11
0
        public virtual async Task SetGlobalAsync(UpdateSettingsDto input)
        {
            foreach (var setting in input.Settings)
            {
                await SettingManager.SetGlobalAsync(setting.Name, setting.Value);

                var settingDefinition = SettingDefinitionManager.GetOrNull(setting.Name);
                if (settingDefinition != null)
                {
                    foreach (var provider in settingDefinition.Providers)
                    {
                        // 同步变更缓存配置
                        await SetCacheItemAsync(setting.Name, setting.Value, provider, null);
                    }
                }
            }

            await CurrentUnitOfWork.SaveChangesAsync();
        }
示例#12
0
        protected virtual async Task <AbpUserSettingConfigDto> GetUserSettingConfig()
        {
            var config = new AbpUserSettingConfigDto
            {
                Values = new Dictionary <string, string>()
            };

            var settingDefinitions = SettingDefinitionManager
                                     .GetAllSettingDefinitions()
                                     .Where(sd => sd.IsVisibleToClients);

            foreach (var settingDefinition in settingDefinitions)
            {
                var settingValue = await SettingManager.GetSettingValueAsync(settingDefinition.Name);

                config.Values.Add(settingDefinition.Name, settingValue);
            }

            return(config);
        }
        public async Task <ListResultDto <SettingNavigationDto> > GetAllAsync()
        {
            var navigations   = SettingDefinitionManager.GetNavigations();
            var settingValues = await GetSettingValues();

            var navigationList = new List <SettingNavigationDto>();

            foreach (var nav in navigations)
            {
                var settingDefinitions = nav.SettingDefinitions.Where(sd =>
                                                                      settingValues.Any(sv => sv.Name == sd.Name) &&
                                                                      sd.GetFieldControlConfigurationOrNull() != null
                                                                      ).ToList();
                if (settingDefinitions.Any())
                {
                    var settings = new List <SettingDto>();
                    foreach (var sd in settingDefinitions)
                    {
                        var group = sd.GetGroupOrNull();
                        settings.Add(new SettingDto(
                                         group == null ? null : group.Localize(StringLocalizerFactory),
                                         sd.Name,
                                         sd.DisplayName.Localize(StringLocalizerFactory),
                                         sd.Description == null?null:sd.Description.Localize(StringLocalizerFactory),
                                         settingValues.Single(sv => sv.Name == sd.Name).Value,
                                         sd.GetFieldControlProviderNameOrNull(),
                                         sd.GetFieldControlConfigurationOrNull()
                                         ));
                    }

                    navigationList.Add(new SettingNavigationDto(
                                           nav.Name,
                                           nav.DisplayName.Localize(StringLocalizerFactory),
                                           settings
                                           ));
                }
            }

            return
                (new ListResultDto <SettingNavigationDto>(navigationList));
        }
示例#14
0
    public virtual async Task <string> GetOrNullAsync(string name)
    {
        var setting   = SettingDefinitionManager.Get(name);
        var providers = Enumerable
                        .Reverse(SettingValueProviderManager.Providers);

        if (setting.Providers.Any())
        {
            providers = providers.Where(p => setting.Providers.Contains(p.Name));
        }

        //TODO: How to implement setting.IsInherited?

        var value = await GetOrNullValueFromProvidersAsync(providers, setting);

        if (value != null && setting.IsEncrypted)
        {
            value = SettingEncryptionService.Decrypt(setting, value);
        }

        return(value);
    }
示例#15
0
    public virtual async Task <List <SettingValue> > GetAllAsync(string[] names)
    {
        var result             = new Dictionary <string, SettingValue>();
        var settingDefinitions = SettingDefinitionManager.GetAll().Where(x => names.Contains(x.Name)).ToList();

        foreach (var definition in settingDefinitions)
        {
            result.Add(definition.Name, new SettingValue(definition.Name, null));
        }

        foreach (var provider in Enumerable.Reverse(SettingValueProviderManager.Providers))
        {
            var settingValues = await provider.GetAllAsync(settingDefinitions.Where(x => !x.Providers.Any() || x.Providers.Contains(provider.Name)).ToArray());

            var notNullValues = settingValues.Where(x => x.Value != null).ToList();
            foreach (var settingValue in notNullValues)
            {
                var settingDefinition = settingDefinitions.First(x => x.Name == settingValue.Name);
                if (settingDefinition.IsEncrypted)
                {
                    settingValue.Value = SettingEncryptionService.Decrypt(settingDefinition, settingValue.Value);
                }

                if (result.ContainsKey(settingValue.Name) && result[settingValue.Name].Value == null)
                {
                    result[settingValue.Name].Value = settingValue.Value;
                }
            }

            settingDefinitions.RemoveAll(x => notNullValues.Any(v => v.Name == x.Name));
            if (!settingDefinitions.Any())
            {
                break;
            }
        }

        return(result.Values.ToList());
    }
示例#16
0
        protected virtual async Task <string> GetOrNullInternalAsync(string name, string providerName, string providerKey, bool fallback = true)
        {
            var setting   = SettingDefinitionManager.Get(name);
            var providers = Enumerable
                            .Reverse(Providers);

            if (providerName != null)
            {
                providers = providers.SkipWhile(c => c.Name != providerName);
            }

            if (!fallback || !setting.IsInherited)
            {
                providers = providers.TakeWhile(c => c.Name == providerName);
            }

            string value = null;

            foreach (var provider in providers)
            {
                value = await provider.GetOrNullAsync(
                    setting,
                    provider.Name == providerName?providerKey : null
                    ).ConfigureAwait(false);

                if (value != null)
                {
                    break;
                }
            }

            if (setting.IsEncrypted)
            {
                value = SettingEncryptionService.Decrypt(setting, value);
            }

            return(value);
        }
示例#17
0
        public async Task <SettingModelInfo> ToModelInfo()
        {
            var modelBasicInfo = ToModelBasicInfo();
            var modelInfo      = new SettingModelInfo
            {
                TypeFullName = modelBasicInfo.TypeFullName,
                ProviderName = modelBasicInfo.ProviderName,
                DisplayName  = modelBasicInfo.DisplayName,
                Description  = modelBasicInfo.Description
            };

            foreach (var prop in ModelProperties)
            {
                var settingDefinition = prop.GetSingleAttributeOrNull <SettingDefinitionAttribute>();
                var customName        = settingDefinition?.CustomName;
                var inputType         = string.Empty;
                if (settingDefinition == null || settingDefinition.InputType == FrontEndInputType.None)
                {
                    inputType = prop.PropertyType.ToFrontEndInputType();
                }
                else
                {
                    inputType = settingDefinition.InputType.ToString();
                }
                var sdManager     = SettingDefinitionManager.GetOrNull(GetSettingName(prop.Name));
                var modelProperty = new SettingModelProperty();
                modelProperty.Name  = prop.Name;
                modelProperty.Value = await GetSettingValueAsync(prop.Name);

                modelProperty.InputType   = inputType;
                modelProperty.DisplayName = sdManager?.DisplayName;
                modelProperty.Description = sdManager?.Description;
                modelInfo.Properties.Add(modelProperty);
            }
            return(modelInfo);
        }
示例#18
0
 public ConfigurationAppService(IOptions <AbpLocalizationOptions> localizationOptions, IServiceProvider serviceProvider, IAbpAuthorizationPolicyProvider abpAuthorizationPolicyProvider, IAuthorizationService authorizationService, ICurrentUser currentUser, ISettingProvider settingProvider, SettingDefinitionManager settingDefinitionManager, IFeatureDefinitionManager featureDefinitionManager, ILanguageProvider languageProvider) : base(localizationOptions, serviceProvider, abpAuthorizationPolicyProvider, authorizationService, currentUser, settingProvider, settingDefinitionManager, featureDefinitionManager, languageProvider)
 {
 }
示例#19
0
        public virtual async Task <List <SettingValue> > GetAllAsync(string providerName, string providerKey, bool fallback = true)
        {
            Check.NotNull(providerName, nameof(providerName));

            var settingDefinitions = SettingDefinitionManager.GetAll();
            var providers          = Enumerable.Reverse(Providers)
                                     .SkipWhile(c => c.Name != providerName);

            if (!fallback)
            {
                providers = providers.TakeWhile(c => c.Name == providerName);
            }

            var providerList = providers.Reverse().ToList();

            if (!providerList.Any())
            {
                return(new List <SettingValue>());
            }

            var settingValues = new Dictionary <string, SettingValue>();

            foreach (var setting in settingDefinitions)
            {
                string value = null;

                if (setting.IsInherited)
                {
                    foreach (var provider in providerList)
                    {
                        var providerValue = await provider.GetOrNullAsync(
                            setting,
                            provider.Name == providerName?providerKey : null
                            ).ConfigureAwait(false);

                        if (providerValue != null)
                        {
                            value = providerValue;
                        }
                    }
                }
                else
                {
                    value = await providerList[0].GetOrNullAsync(
                        setting,
                        providerKey
                        ).ConfigureAwait(false);
                }

                if (setting.IsEncrypted)
                {
                    value = SettingEncryptionService.Decrypt(setting, value);
                }

                if (value != null)
                {
                    settingValues[setting.Name] = new SettingValue(setting.Name, value);
                }
            }

            return(settingValues.Values.ToList());
        }
示例#20
0
        protected virtual async Task <ListResultDto <SettingGroupDto> > GetAllForProviderAsync(string providerName, string providerKey)
        {
            /*
             * 2020-11-19
             * [email protected]
             *
             * 之所以重构为这种看似硬编码的设计,是因为硬编码的都是常用的自带的配置
             *
             * 自定义的应用模块可以实现返回相同Dto的配置服务,然后通过路由的聚合功能,
             * 轻松加入到前端的设置管理(因为vue前端已设计为动态表单页面)
             *
             * 最初的设计才是不合理的,前端不能硬编码设置管理界面,这应该是后端的事情
             */

            var settingGroups = new List <SettingGroupDto>();

            #region 系统设置

            var sysSettingGroup = new SettingGroupDto(L["DisplayName:System"], L["Description:System"]);
            // 语言
            var languageSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Language"], L["Description:System.Language"]);
            languageSetting.AddDetail(
                SettingDefinitionManager.Get(LocalizationSettingNames.DefaultLanguage),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage, providerName, providerKey),
                ValueType.Option)
            .AddOptions(LocalizationOptions.Languages.Select(l => new OptionDto(l.DisplayName, l.CultureName)));
            // 时区
            var timingSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Timing"], L["Description:System.Timing"]);
            timingSetting.AddDetail(
                SettingDefinitionManager.Get(TimingSettingNames.TimeZone),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(TimingSettingNames.TimeZone, providerName, providerKey),
                ValueType.String);
            settingGroups.Add(sysSettingGroup);

            #endregion

            #region 安全设置

            var securitySettingGroup = new SettingGroupDto(L["DisplayName:Security"], L["Description:Security"]);

            // 用户账户
            var accountSetting = securitySettingGroup.AddSetting(L["DisplayName:Security.Account"], L["Description:Security.Account"]);
            // 启用本地登录
            accountSetting.AddDetail(
                SettingDefinitionManager.Get(AccountSettingNames.EnableLocalLogin),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(AccountSettingNames.EnableLocalLogin, providerName, providerKey),
                ValueType.Boolean);
            accountSetting.AddDetail(
                SettingDefinitionManager.Get(AccountSettingNames.IsSelfRegistrationEnabled),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(AccountSettingNames.IsSelfRegistrationEnabled, providerName, providerKey),
                ValueType.Boolean);

            settingGroups.Add(securitySettingGroup);

            #endregion

            #region 身份标识设置

            // 身份标识设置
            var identitySetting = new SettingGroupDto(L["DisplayName:Identity"], L["Description:Identity"]);

            #region 用户锁定

            var lockoutSetting = identitySetting.AddSetting(L["DisplayName:Identity.Lockout"], L["Description:Identity.Lockout"]);
            lockoutSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.Lockout.AllowedForNewUsers),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.AllowedForNewUsers, providerName, providerKey),
                ValueType.Boolean);
            lockoutSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.Lockout.LockoutDuration),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.LockoutDuration, providerName, providerKey),
                ValueType.Number);
            lockoutSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.Lockout.MaxFailedAccessAttempts),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.MaxFailedAccessAttempts, providerName, providerKey),
                ValueType.Number);

            #endregion

            #region 用户

            var userSetting = identitySetting.AddSetting(L["DisplayName:Identity.User"], L["Description:Identity.User"]);
            userSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.User.IsEmailUpdateEnabled),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsEmailUpdateEnabled, providerName, providerKey),
                ValueType.Boolean);
            userSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.User.IsUserNameUpdateEnabled),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled, providerName, providerKey),
                ValueType.Boolean);
            userSetting.AddDetail(
                SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister, providerName, providerKey),
                ValueType.String);
            userSetting.AddDetail(
                SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword, providerName, providerKey),
                ValueType.String);
            userSetting.AddDetail(
                SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin, providerName, providerKey),
                ValueType.String);
            userSetting.AddDetail(
                SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed, providerName, providerKey),
                ValueType.String);
            userSetting.AddDetail(
                SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval, providerName, providerKey),
                ValueType.Number);

            #endregion

            #region 登录

            var signinSetting = identitySetting.AddSetting(L["DisplayName:Identity.SignIn"], L["Description:Identity.SignIn"]);
            signinSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation, providerName, providerKey),
                ValueType.Boolean);
            signinSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedEmail),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedEmail, providerName, providerKey),
                ValueType.Boolean);
            signinSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber, providerName, providerKey),
                ValueType.Boolean);

            #endregion

            #region 密码

            var passwordSetting = identitySetting.AddSetting(L["DisplayName:Identity.Password"], L["Description:Identity.Password"]);
            passwordSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireDigit),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireDigit, providerName, providerKey),
                ValueType.Boolean);
            passwordSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredLength),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredLength, providerName, providerKey),
                ValueType.Number);
            passwordSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredUniqueChars),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredUniqueChars, providerName, providerKey),
                ValueType.Number);
            passwordSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireLowercase),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireLowercase, providerName, providerKey),
                ValueType.Boolean);
            passwordSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireUppercase),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireUppercase, providerName, providerKey),
                ValueType.Boolean);
            passwordSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireNonAlphanumeric),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireNonAlphanumeric, providerName, providerKey),
                ValueType.Boolean);

            #endregion

            #region 双因素

            var twoFactorSetting = identitySetting.AddSetting(L["DisplayName:Identity.TwoFactor"], L["Description:Identity.TwoFactor"]);
            twoFactorSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.Behaviour),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.Behaviour, providerName, providerKey),
                ValueType.Option)
            .AddOption(IdentityTwoFactorBehaviour.Optional.ToString(), IdentityTwoFactorBehaviour.Optional.ToString())
            .AddOption(IdentityTwoFactorBehaviour.Forced.ToString(), IdentityTwoFactorBehaviour.Forced.ToString())
            .AddOption(IdentityTwoFactorBehaviour.Disabled.ToString(), IdentityTwoFactorBehaviour.Disabled.ToString());
            twoFactorSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.UsersCanChange),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.UsersCanChange, providerName, providerKey),
                ValueType.Boolean);

            #endregion

            #region 组织机构

            var ouSetting = identitySetting.AddSetting(L["DisplayName:Identity.OrganizationUnit"], L["Description:Identity.OrganizationUnit"]);
            ouSetting.AddDetail(
                SettingDefinitionManager.Get(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount, providerName, providerKey),
                ValueType.Number);

            settingGroups.Add(identitySetting);

            #endregion

            #endregion

            #region 邮件设置

            var emailSettingGroup  = new SettingGroupDto(L["DisplayName:Emailing"], L["Description:Emailing"]);
            var defaultMailSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Default"], L["Description:Emailing.Default"]);
            defaultMailSetting.AddDetail(
                SettingDefinitionManager.Get(EmailSettingNames.DefaultFromAddress),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromAddress, providerName, providerKey),
                ValueType.String);
            defaultMailSetting.AddDetail(
                SettingDefinitionManager.Get(EmailSettingNames.DefaultFromDisplayName),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromDisplayName, providerName, providerKey),
                ValueType.String);

            var smtpSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Smtp"], L["Description:Emailing.Smtp"]);
            smtpSetting.AddDetail(
                SettingDefinitionManager.Get(EmailSettingNames.Smtp.EnableSsl),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.EnableSsl, providerName, providerKey),
                ValueType.Boolean);
            smtpSetting.AddDetail(
                SettingDefinitionManager.Get(EmailSettingNames.Smtp.UseDefaultCredentials),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UseDefaultCredentials, providerName, providerKey),
                ValueType.Boolean);
            smtpSetting.AddDetail(
                SettingDefinitionManager.Get(EmailSettingNames.Smtp.Domain),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Domain, providerName, providerKey),
                ValueType.String);
            smtpSetting.AddDetail(
                SettingDefinitionManager.Get(EmailSettingNames.Smtp.Host),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Host, providerName, providerKey),
                ValueType.String);
            smtpSetting.AddDetail(
                SettingDefinitionManager.Get(EmailSettingNames.Smtp.Port),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Port, providerName, providerKey),
                ValueType.Number);
            smtpSetting.AddDetail(
                SettingDefinitionManager.Get(EmailSettingNames.Smtp.UserName),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UserName, providerName, providerKey),
                ValueType.String);
            smtpSetting.AddDetail(
                SettingDefinitionManager.Get(EmailSettingNames.Smtp.Password),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Password, providerName, providerKey),
                ValueType.String);

            settingGroups.Add(emailSettingGroup);

            #endregion

            #region 文件设置

            var fileSettingGroup  = new SettingGroupDto(L["DisplayName:FileManagement"], L["Description:FileManagement"]);
            var fileSystemSetting = fileSettingGroup.AddSetting(L["DisplayName:FileManagement.FileSystem"], L["Description:FileManagement.FileSystem"]);
            fileSystemSetting.AddDetail(
                SettingDefinitionManager.Get(AbpFileManagementSettingNames.FileLimitLength),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(AbpFileManagementSettingNames.FileLimitLength, providerName, providerKey),
                ValueType.Number);
            fileSystemSetting.AddDetail(
                SettingDefinitionManager.Get(AbpFileManagementSettingNames.AllowFileExtensions),
                StringLocalizerFactory,
                await SettingManager.GetOrNullAsync(AbpFileManagementSettingNames.AllowFileExtensions, providerName, providerKey),
                ValueType.String);

            settingGroups.Add(fileSettingGroup);

            #endregion

            return(new ListResultDto <SettingGroupDto>(settingGroups));
        }