- Steps to reproduce the issue: UPgraded project from 9.0.4 to 9.2.3 version of Volo. We had Helper override methods for class "ExternalProviderSettingsHelper". We need them to save tenant specific external login settings. GetByNameAsync(string name, bool fallBackToHost = false) and public override async Task SetAsync(List<ExternalProviderSettings> settings) not working now. Please help.
66 Answer(s)
-
0
done, thank you
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
Thank you for the code. But where should I use it. I have code like below. It used tow work before with 9.0.4 now it is not saving settings for External provider. please check public override async Task SetAsync(List<ExternalProviderSettings> settings) method. I have updated parameters for it to build with 9.2.3
public class Shared_TMSExternalProviderSettingsHelper : ExternalProviderSettingsHelper { private readonly ICurrentTenant _currentTenant; private readonly AbpExternalProviderOptions _externalProviderOptions; private readonly Volo.Abp.SettingManagement.ISettingManager _settingManager; private readonly IJsonSerializer _jsonSerializer;
public Shared_TMSExternalProviderSettingsHelper( ICurrentTenant currentTenant, IOptions<AbpExternalProviderOptions> externalProvidersOptions, Volo.Abp.SettingManagement.ISettingManager settingManager, IJsonSerializer jsonSerializer, ISettingEncryptionService stringEncryptionService, ISettingDefinitionManager settingDefinitionManager) : base(currentTenant, externalProvidersOptions, settingManager, jsonSerializer, stringEncryptionService, settingDefinitionManager) { _currentTenant = currentTenant; _externalProviderOptions = externalProvidersOptions.Value; _settingManager = settingManager; _jsonSerializer = jsonSerializer; } public override async Task<List<ExternalProviderSettings>> GetAllAsync() { var allSettings = new List<ExternalProviderSettings>(); List<ExternalProviderSettings> hostSettingsList; using (_currentTenant.Change(_currentTenant.Id)) { hostSettingsList = await GetSettingsListOrNullAsync(GlobalSettingValueProvider.ProviderName, null); } var settingsList = _currentTenant.IsAvailable ? await GetSettingsListOrNullAsync(TenantSettingValueProvider.ProviderName, _currentTenant.Id?.ToString()) : hostSettingsList; foreach (var externalProviderDefinition in _externalProviderOptions.Definitions) { var newSettings = CreateSettings(externalProviderDefinition); var existSettings = settingsList?.FirstOrDefault(x => x.Name == externalProviderDefinition.Name); if (existSettings != null) { CloneSettings(existSettings, newSettings); } if (_currentTenant.IsAvailable) { newSettings.Enabled = settingsList?.FirstOrDefault(x => x.Name == externalProviderDefinition.Name)?.Enabled ?? false; } allSettings.Add(newSettings); } return allSettings; } public async Task<ExternalProviderSettings> GetByNameAsync(string name, bool fallBackToHost = false) { var definition = _externalProviderOptions.Definitions.FirstOrDefault(x => x.Name == name); if (definition == null) { throw new Exception($"External provider with {name} not definition!"); } if (_currentTenant.IsAvailable) { var settings = await GetSettingsAsync(definition, TenantSettingValueProvider.ProviderName, _currentTenant.Id?.ToString()); if (settings.Enabled || !fallBackToHost) { return settings; } } return await GetSettingsAsync(definition, GlobalSettingValueProvider.ProviderName, null); ; } public virtual ExternalProviderDefinition GetDefinitionsByNameOrNull(string name) { return _externalProviderOptions.Definitions.FirstOrDefault(x => x.Name == name); } //public async Task SetAsync(List<ExternalProviderSettings> settings) //{ // foreach (var setting in settings) // { // var prefix = $"Abp.ExternalLogin.{setting.Name}"; // await _settingManager.SetForTenantAsync(_currentTenant.Id, $"{prefix}.ClientId", setting.ClientId); // await _settingManager.SetForTenantAsync(_currentTenant.Id, $"{prefix}.ClientSecret", setting.ClientSecret); // await _settingManager.SetForTenantAsync(_currentTenant.Id, $"{prefix}.IsEnabled", setting.IsEnabled.ToString().ToLowerInvariant()); // } //} public override async Task SetAsync(List<ExternalProviderSettings> settings) { foreach (var setting in settings) { var definition = _externalProviderOptions.Definitions.FirstOrDefault(x => x.Name == setting.Name); if (definition == null) { throw new Exception($"External provider with {settings[0].Name} not definition!"); } var newSettings = CreateSettings(definition); CloneSettings(setting, newSettings); if (_currentTenant.IsAvailable) { newSettings.Enabled = setting.Enabled; } var existSettingsList = (_currentTenant.IsAvailable ? await GetSettingsListOrNullAsync(TenantSettingValueProvider.ProviderName, _currentTenant.Id?.ToString()) : await GetSettingsListOrNullAsync(GlobalSettingValueProvider.ProviderName, null)) ?? new List<ExternalProviderSettings>(); existSettingsList.RemoveAll(x => x.Name == definition.Name); existSettingsList.Add(newSettings); if (_currentTenant.IsAvailable) { await _settingManager.SetForCurrentTenantAsync(AccountSettingNames.ExternalProviders, _jsonSerializer.Serialize(existSettingsList)); } else { await _settingManager.SetGlobalAsync(AccountSettingNames.ExternalProviders, _jsonSerializer.Serialize(existSettingsList)); } } } protected virtual async Task<ExternalProviderSettings> GetSettingsAsync( ExternalProviderDefinition definition, string providerName, string providerKey) { var newSettings = CreateSettings(definition); var settingsList = await GetSettingsListOrNullAsync(providerName, providerKey); var existSettings = settingsList?.FirstOrDefault(x => x.Name == definition.Name); if (existSettings != null) { CloneSettings(existSettings, newSettings); } return newSettings; } protected virtual async Task<List<ExternalProviderSettings>> GetSettingsListOrNullAsync( string providerName, string providerKey) { var settings = await _settingManager.GetOrNullAsync(AccountSettingNames.ExternalProviders, providerName, providerKey, false); return settings.IsNullOrWhiteSpace() ? null : _jsonSerializer.Deserialize<List<ExternalProviderSettings>>(settings); } protected virtual ExternalProviderSettings CreateSettings(ExternalProviderDefinition definition) { return new ExternalProviderSettings { Name = definition.Name, Enabled = false, Properties = definition.Properties. Where(x => !x.IsSecret). Select(x => new ExternalProviderSettingsProperty(x.PropertyName, null)). ToList(), SecretProperties = definition.Properties. Where(x => x.IsSecret). Select(x => new ExternalProviderSettingsProperty(x.PropertyName, null)). ToList() }; } protected virtual void CloneSettings(ExternalProviderSettings source, ExternalProviderSettings dest) { dest.Name = source.Name; dest.Enabled = source.Enabled; foreach (var item in dest.Properties) { item.Value = source.Properties.FirstOrDefault(x => x.Name.Equals(item.Name, StringComparison.InvariantCultureIgnoreCase))?.Value; } foreach (var item in dest.SecretProperties) { item.Value = source.SecretProperties.FirstOrDefault(x => x.Name.Equals(item.Name, StringComparison.InvariantCultureIgnoreCase))?.Value; } }}
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
please check my response above. I am trying to save settings of subdomain tenant. It is erroring.
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
It was done to save tenant specific external login options. One tenant need AD another needs Ping.
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
will it work without override ?
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
Sure, let me try. New template ? Which file ?
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
if I change clientID and secret in the UI for the tenant, will it work automatically in 9.2.3 version? No code change is needed ?
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
I removed that file and recompiled. It does not save settings (PingID ) information for tenant. If I login without tenant, it saved data. We need to save data for tenant.
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
sure. 1- login to non tenant 2- go to settings (External provider) 3- add client id,client secret etc for Microsoft (AD) 4- save 5- create tenantA 6- login as admin for the tenantA 7- go to settings (External provider) 8- Update pingID settings 9- save 10- logout from tenant 11- login to tenant 12- settings entered in step 8 above is missing
Please try and let me know. Thank you
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
Users page is not working as well. This is another issue when we upgraded
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post)
-
0Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post)
-
0
hi
Can you try with a new database or clear the setting from database.
If still not working can share your test project?
Liming.Ma@volosoft.com
Thanks.
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
Thank you, Login to http://dev.approach.cpat.com
- Administrator -> settings -> external provider
- Selct Microsoft for host admin
- login to cpattest tenant: http://cpattest.dev.approach.cpat.com
- select PingOne from Administrator -> settings -> external provider
- logout of tenant
- login again to cpattest tenant
- the external provider is missing
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
hi Can you try with a new database or clear the setting from database.
If still not working can share your test project?
liming.ma@volosoft.com
Thanks.
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post)






