Open Closed

External provider setting exception #8921


User avatar
0
464199480 created
  • ABP Framework version: v9.1.0

  • UI Type: Angular

  • Database System: EF Core (SQL Server)

  • Exception message and full stack trace:

  • Steps to reproduce the issue:

All Client secrets are not displayed and this has affected the OAuth login. The Client secret acquisition is encrypted.
image.png


17 Answer(s)
  • User Avatar
    0
    464199480 created

    Why is it necessary to encrypt the Client secret? This leads to a very serious disaster in the update of the Release environment, and this is not mentioned in the migration instructions.

  • User Avatar
    0
    EngincanV created
    Support Team .NET Developer

    Hi, the encryption of the Client Secret in ABP’s External Provider settings is a security measure designed to protect sensitive authentication credentials. Storing client secrets in plaintext poses a significant security risk, especially if unauthorized users gain access to the database or configuration files. Encrypting them helps prevent exposure in case of data leaks or misconfiguration.

    Regards.

  • User Avatar
    0
    464199480 created

    Ok.
    How to solve the problem of failed login from External provider now? The Client secrets obtained by my provider are encrypted.

  • User Avatar
    0
    EngincanV created
    Support Team .NET Developer

    Ok.
    How to solve the problem of failed login from External provider now? The Client secrets obtained by my provider are encrypted.

    Hi, since the client secret is encrypted then the provider is also expecting it from you with the encrypted value, so you can just set the clientSecret according to the provided value:

    context.Services.AddAuthentication()
                .AddMicrosoftAccount(MicrosoftAccountDefaults.AuthenticationScheme, options =>
                {
                    //other configs...
                    
                    options.ClientSecret = "<set-your-client-secret>"; //get it from appsettings.json or secret manager
                })
    
  • User Avatar
    0
    464199480 created

    Using your approach will result in the clientSecret configured by tenant in the setting being ineffective.

  • User Avatar
    0
    liangshiwei created
    Support Team Fullstack Developer

    Open
    External provider setting exception

    What is the error message, could you share the full logs?

  • User Avatar
    0
    liangshiwei created
    Support Team Fullstack Developer

    Hi,

    We will fix the problem in the next patch version. and your ticket was refunded.

    you can try this as a temporary solution

    [Dependency(ReplaceServices = true)]
    [ExposeServices(typeof(ExternalProviderSettingsHelper))]
    public class MyExternalProviderSettingsHelper : ExternalProviderSettingsHelper
    {
        private readonly ISettingDefinitionManager _settingDefinitionManager;
        private readonly ISettingEncryptionService _settingEncryptionService;
        private readonly ICurrentTenant _currentTenant;
        private readonly AbpExternalProviderOptions _externalProviderOptions;
        private readonly ISettingManager _settingManager;
        private readonly IJsonSerializer _jsonSerializer;
        public MyExternalProviderSettingsHelper(
            ICurrentTenant currentTenant, 
            IOptions<AbpExternalProviderOptions> externalProvidersOptions,
            ISettingManager settingManager,
            IJsonSerializer jsonSerializer,
            IStringEncryptionService stringEncryptionService,
            ISettingDefinitionManager settingDefinitionManager,
            ISettingEncryptionService settingEncryptionService) 
               : base(currentTenant, externalProvidersOptions, settingManager, jsonSerializer, stringEncryptionService)
        {
            _settingDefinitionManager = settingDefinitionManager;
            _settingEncryptionService = settingEncryptionService;
            _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(null))
            {
                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 = hostSettingsList?.FirstOrDefault(x => x.Name == externalProviderDefinition.Name)?.Enabled
                                          ?? false;
                }
    
                allSettings.Add(newSettings);
            }
    
            var settingDefinition = await _settingDefinitionManager.GetAsync(AccountSettingNames.ExternalProviders);
            foreach (var secretProperty in allSettings.SelectMany(setting => setting.SecretProperties))
            {
                secretProperty.Value = _settingEncryptionService.Decrypt(settingDefinition, secretProperty.Value);
            }
    
            return allSettings;
        }
    
        public async override Task SetAsync(ExternalProviderSettings settings)
        {
            var definition = _externalProviderOptions.Definitions.FirstOrDefault(x => x.Name == settings.Name);
            if (definition == null)
            {
                throw new Exception($"External provider with {settings.Name} not definition!");
            }
    
            var newSettings = CreateSettings(definition);
    
            CloneSettings(settings, newSettings);
    
            if (_currentTenant.IsAvailable)
            {
                newSettings.Enabled = true;
            }
    
            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);
            
            var settingDefinition = await _settingDefinitionManager.GetAsync(AccountSettingNames.ExternalProviders);
            foreach (var secretProperty in newSettings.SecretProperties)
            {
                secretProperty.Value = _settingEncryptionService.Encrypt(settingDefinition, secretProperty.Value);
            }
    
            if (_currentTenant.IsAvailable)
            {
                await _settingManager.SetForCurrentTenantAsync(AccountSettingNames.ExternalProviders, _jsonSerializer.Serialize(existSettingsList));
            }
            else
            {
                await _settingManager.SetGlobalAsync(AccountSettingNames.ExternalProviders, _jsonSerializer.Serialize(existSettingsList));
            }
        }
    }
    
  • User Avatar
    0
    464199480 created

    Hi !
    I applied this piece of code, but the issue still remained unsolved.

    Could you copy the code of Microsoft.AspNetCore.Authentication.MicrosoftAccount?
    The ClientSecret obtained in the code is encrypted content.

    [Dependency(ReplaceServices = true)]
    [ExposeServices(typeof(ExternalProviderSettingsHelper))]
    public class MyExternalProviderSettingsHelper : ExternalProviderSettingsHelper
    {
    private readonly ISettingDefinitionManager _settingDefinitionManager;
    private readonly ISettingEncryptionService _settingEncryptionService;
    private readonly ICurrentTenant _currentTenant;
    private readonly AbpExternalProviderOptions _externalProviderOptions;
    private readonly ISettingManager _settingManager;
    private readonly IJsonSerializer _jsonSerializer;
    public MyExternalProviderSettingsHelper(
    ICurrentTenant currentTenant,
    IOptions<AbpExternalProviderOptions> externalProvidersOptions,
    ISettingManager settingManager,
    IJsonSerializer jsonSerializer,
    IStringEncryptionService stringEncryptionService,
    ISettingDefinitionManager settingDefinitionManager,
    ISettingEncryptionService settingEncryptionService)
    : base(currentTenant, externalProvidersOptions, settingManager, jsonSerializer, stringEncryptionService)
    {
    _settingDefinitionManager = settingDefinitionManager;
    _settingEncryptionService = settingEncryptionService;
    _currentTenant = currentTenant;
    _externalProviderOptions = externalProvidersOptions.Value;
    _settingManager = settingManager;
    _jsonSerializer = jsonSerializer;
    }

  • User Avatar
    0
    liangshiwei created
    Support Team Fullstack Developer

    Hi

    What is the error message, could you share the full logs? thanks

  • User Avatar
    0
    464199480 created

    Hi

    AuthenticationFailureException: OAuth token endpoint failure: invalid_client;Description=AADSTS7000215: Invalid client secret provided. Ensure the secret being sent in the request is the client secret value, not the client secret ID, for a secret added to app 'e42cec2e-afd5-45ef-83e6-85bb54f58b19'. Trace ID: 0262dabf-2e50-47a0-8117-7d83235a2100 Correlation ID: f7fce4f7-bef4-44b9-917e-b5077b8d7bc8 Timestamp: 2025-03-11 06:05:36Z;Uri=https://login.microsoftonline.com/error?code=7000215
    
  • User Avatar
    0
    464199480 created

    Could you try to apply for a Microsoft clientId? It might help to reproduce my problem.

  • User Avatar
    0
    liangshiwei created
    Support Team Fullstack Developer

    Hi,

    I can reproduce the problem.

    Try this

    [Dependency(ReplaceServices = true)]
    [ExposeServices(typeof(ExternalProviderSettingsHelper))]
    public class MyExternalProviderSettingsHelper : ExternalProviderSettingsHelper
    {
        private readonly ISettingDefinitionManager _settingDefinitionManager;
        private readonly ISettingEncryptionService _settingEncryptionService;
        private readonly ICurrentTenant _currentTenant;
        private readonly AbpExternalProviderOptions _externalProviderOptions;
        private readonly ISettingManager _settingManager;
        private readonly IJsonSerializer _jsonSerializer;
        public MyExternalProviderSettingsHelper(
            ICurrentTenant currentTenant, 
            IOptions<AbpExternalProviderOptions> externalProvidersOptions,
            ISettingManager settingManager,
            IJsonSerializer jsonSerializer,
            IStringEncryptionService stringEncryptionService,
            ISettingDefinitionManager settingDefinitionManager,
            ISettingEncryptionService settingEncryptionService) 
               : base(currentTenant, externalProvidersOptions, settingManager, jsonSerializer, stringEncryptionService)
        {
            _settingDefinitionManager = settingDefinitionManager;
            _settingEncryptionService = settingEncryptionService;
            _currentTenant = currentTenant;
            _externalProviderOptions = externalProvidersOptions.Value;
            _settingManager = settingManager;
            _jsonSerializer = jsonSerializer;
        }
    
        protected override async Task<ExternalProviderSettings> GetSettingsAsync(ExternalProviderDefinition definition, string providerName, string providerKey)
        {
            var settings = await base.GetSettingsAsync(definition, providerName, providerKey);
    
             var settingDefinition = await _settingDefinitionManager.GetAsync(AccountSettingNames.ExternalProviders);
            foreach (var secretProperty in settings.SecretProperties)
            {
                secretProperty.Value = _settingEncryptionService.Decrypt(settingDefinition, secretProperty.Value);
            }
    
            return settings;
        }
    
        public override async Task<List<ExternalProviderSettings>> GetAllAsync()
        {
            var allSettings = new List<ExternalProviderSettings>();
    
            List<ExternalProviderSettings> hostSettingsList;
            using (_currentTenant.Change(null))
            {
                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 = hostSettingsList?.FirstOrDefault(x => x.Name == externalProviderDefinition.Name)?.Enabled
                                          ?? false;
                }
    
                allSettings.Add(newSettings);
            }
    
            var settingDefinition = await _settingDefinitionManager.GetAsync(AccountSettingNames.ExternalProviders);
            foreach (var secretProperty in allSettings.SelectMany(setting => setting.SecretProperties))
            {
                secretProperty.Value = _settingEncryptionService.Decrypt(settingDefinition, secretProperty.Value);
            }
    
            return allSettings;
        }
    
        public async override Task SetAsync(ExternalProviderSettings settings)
        {
            var definition = _externalProviderOptions.Definitions.FirstOrDefault(x => x.Name == settings.Name);
            if (definition == null)
            {
                throw new Exception($"External provider with {settings.Name} not definition!");
            }
    
            var newSettings = CreateSettings(definition);
    
            CloneSettings(settings, newSettings);
    
            if (_currentTenant.IsAvailable)
            {
                newSettings.Enabled = true;
            }
    
            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);
            
            var settingDefinition = await _settingDefinitionManager.GetAsync(AccountSettingNames.ExternalProviders);
            foreach (var secretProperty in newSettings.SecretProperties)
            {
                secretProperty.Value = _settingEncryptionService.Encrypt(settingDefinition, secretProperty.Value);
            }
    
            if (_currentTenant.IsAvailable)
            {
                await _settingManager.SetForCurrentTenantAsync(AccountSettingNames.ExternalProviders, _jsonSerializer.Serialize(existSettingsList));
            }
            else
            {
                await _settingManager.SetGlobalAsync(AccountSettingNames.ExternalProviders, _jsonSerializer.Serialize(existSettingsList));
            }
        }
    }
    
    
  • User Avatar
    0
    464199480 created

    Hi.
    It works.
    When will the fix be released?

  • User Avatar
    0
    liangshiwei created
    Support Team Fullstack Developer

    Hi,

    We may release a patch version next week

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    hi 464199480

    Remember to remove the MyExternalProviderSettingsHelper in the next patch version.

  • User Avatar
    0
    alex.maiereanu@3sstudio.com created

    Hi, is this also fixing the issue that on migration to 9.1 the old values are not usable anymore? Or we need to reconfigure them?

    I understand that this is a security measure but this should have been part of the migration guide so that we know what we are signing up to :D

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    hi alex.maiereanu@3sstudio.com

    Yes, the next patch version will fix all.

Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
Do you need assistance from an ABP expert?
Schedule a Meeting
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v9.2.0-preview. Updated on March 18, 2025, 10:42