@@ -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