Skip to content

Commit 4815b20

Browse files
committed
Fix issue around ticket refreshes failing
1 parent 3e71840 commit 4815b20

File tree

1 file changed

+39
-20
lines changed

1 file changed

+39
-20
lines changed

src/KerberosSidecar/KerberosWorker.cs

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ private async Task SetupMitKerberos()
5353
{
5454
await CreateMitKerberosKrb5Config();
5555
await CreateMitKerberosKeytab();
56-
await EnsureTgt();
56+
await EnsureTgt(true);
5757
await _spnProvider.EnsureSpns(_cancellationToken);
5858
_tgtHealthCheck.LastException = null;
5959
}
@@ -88,13 +88,43 @@ private async Task CreateMitKerberosKrb5Config()
8888
/// <summary>
8989
/// Authenticates the principal and populates ticket cache
9090
/// </summary>
91-
private async Task EnsureTgt()
91+
private async Task EnsureTgt(bool initial)
9292
{
93-
var credentials = await _credentialFactory.Get(_options.CurrentValue, _cancellationToken);
94-
await _options.CurrentValue.KerberosClient.Authenticate(credentials);
95-
_tgtHealthCheck.LastException = null;
96-
_logger.LogInformation("Service authenticated successfully as '{Principal}'", credentials.UserName);
97-
93+
94+
try
95+
{
96+
97+
var ticketCache = (Krb5TicketCache)_options.CurrentValue.KerberosClient.Cache;
98+
var tgt = ticketCache.Krb5Cache.Credentials.FirstOrDefault(x => x.Server.Name.Contains("krbtgt"));
99+
var credentials = await _credentialFactory.Get(_options.CurrentValue, _cancellationToken);
100+
101+
var hasTgt = tgt != null;
102+
var tgtNeedsRenewal = tgt != null && DateTimeOffset.UtcNow.AddMinutes(15) > tgt.RenewTill && tgt.EndTime < DateTimeOffset.UtcNow;
103+
if (tgt == null || tgt.EndTime < DateTimeOffset.UtcNow)
104+
{
105+
await _options.CurrentValue.KerberosClient.Authenticate(credentials);
106+
}
107+
else if (DateTimeOffset.UtcNow.AddMinutes(15) > tgt.RenewTill)
108+
{
109+
await _options.CurrentValue.KerberosClient.RenewTicket();
110+
}
111+
112+
if (initial)
113+
{
114+
_logger.LogInformation("Service authenticated successfully as '{Principal}'", credentials.UserName);
115+
}
116+
else
117+
{
118+
_logger.LogDebug("Service successfully renewed TGT ticket");
119+
}
120+
121+
_tgtHealthCheck.LastException = null;
122+
123+
}
124+
catch (Exception e)
125+
{
126+
_tgtHealthCheck.LastException = e;
127+
}
98128
}
99129

100130
/// <summary>
@@ -136,20 +166,9 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
136166
await SetupMitKerberos();
137167
while (!stoppingToken.IsCancellationRequested)
138168
{
139-
await RefreshTicketIfExpiring();
169+
await EnsureTgt(false);
140170
await Task.Delay(1000, stoppingToken);
141171
}
142172
}
143-
144-
private async Task RefreshTicketIfExpiring()
145-
{
146-
var ticketCache = (Krb5TicketCache)_options.CurrentValue.KerberosClient.Cache;
147-
var tgt = ticketCache.Krb5Cache.Credentials.FirstOrDefault(x => x.Server.Name.Contains("krbtgt"));
148-
if(tgt == null)
149-
return;
150-
if (DateTimeOffset.UtcNow.AddMinutes(15) > tgt.RenewTill)
151-
{
152-
await _options.CurrentValue.KerberosClient.RenewTicket();
153-
}
154-
}
173+
155174
}

0 commit comments

Comments
 (0)