diff --git a/src/Models/LdapConfigModel.cs b/src/Models/LdapConfigModel.cs index 7d9eca7..53a0d5f 100644 --- a/src/Models/LdapConfigModel.cs +++ b/src/Models/LdapConfigModel.cs @@ -13,4 +13,5 @@ public class LdapConfig public string UsersOu { get; set; } = "ou=users"; public string GroupsOu { get; set; } = "ou=groups"; public string MigrationsOu { get; set; } = "ou=migrations"; + public int ConnectionRetryCount { get; set; } = 10; } \ No newline at end of file diff --git a/src/Services/LdapService.cs b/src/Services/LdapService.cs index 22038fb..76416e6 100644 --- a/src/Services/LdapService.cs +++ b/src/Services/LdapService.cs @@ -23,19 +23,39 @@ public partial class LdapService : IDisposable private async Task ConnectAndBind() { - if (!_conn.Connected) + int retries = 0; + while (retries++ < _opts.ConnectionRetryCount) { try { - await _conn.ConnectAsync(_opts.Host, _opts.Port); + if (!_conn.Connected) + { + try + { + await _conn.ConnectAsync(_opts.Host, _opts.Port); + } + catch (SystemException ex) + { + _logger.LogWarning("Unable to connect to LDAP: {ex.Message}\n{ex.StackTrace}", [ex.Message, ex.StackTrace]); + throw; + } + } + await _conn.BindAsync(_opts.BindDn, _opts.BindPassword); + return; } - catch (SystemException ex) + catch (Exception ex) { - _logger.LogCritical("Unable to connect to LDAP: {ex.Message}\n{ex.StackTrace}", [ex.Message, ex.StackTrace]); - throw; + if (retries == _opts.ConnectionRetryCount) + { + _logger.LogError("Unable to connect to LDAP: {ex.Message}\n{ex.StackTrace}", [ex.Message, ex.StackTrace]); + throw; + } + else + { + _logger.LogWarning("Unable to connect to LDAP: {ex.Message}\n{ex.StackTrace}", [ex.Message, ex.StackTrace]); + } } } - await _conn.BindAsync(_opts.BindDn, _opts.BindPassword); } public string AssetsBaseDn => string.IsNullOrEmpty(_opts.AssetsOu) ? _opts.BaseDn : $"{_opts.AssetsOu},{_opts.BaseDn}";