diff --git a/src/Microsoft.IdentityModel.Tokens/ValidatorUtilities.cs b/src/Microsoft.IdentityModel.Tokens/ValidatorUtilities.cs
new file mode 100644
index 0000000000..482f2f3d37
--- /dev/null
+++ b/src/Microsoft.IdentityModel.Tokens/ValidatorUtilities.cs
@@ -0,0 +1,55 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+using System;
+using Microsoft.IdentityModel.Logging;
+
+namespace Microsoft.IdentityModel.Tokens
+{
+ ///
+ /// Internal Validator Utilities
+ ///
+ internal static class ValidatorUtilities
+ {
+ ///
+ /// Validates the lifetime of a .
+ ///
+ /// The 'notBefore' time found in the .
+ /// The 'expiration' time found in the .
+ /// The being validated.
+ /// required for validation.
+ /// If 'expires.HasValue' is false and is true.
+ /// If 'notBefore' is > 'expires'.
+ /// If 'notBefore' is > DateTime.UtcNow.
+ /// If 'expires' is < DateTime.UtcNow.
+ /// All time comparisons apply .
+ internal static void ValidateLifetime(DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters)
+ {
+ if (!expires.HasValue && validationParameters.RequireExpirationTime)
+ throw LogHelper.LogExceptionMessage(new SecurityTokenNoExpirationException(LogHelper.FormatInvariant(LogMessages.IDX10225, LogHelper.MarkAsNonPII(securityToken == null ? "null" : securityToken.GetType().ToString()))));
+
+ if (notBefore.HasValue && expires.HasValue && (notBefore.Value > expires.Value))
+ throw LogHelper.LogExceptionMessage(new SecurityTokenInvalidLifetimeException(LogHelper.FormatInvariant(LogMessages.IDX10224, LogHelper.MarkAsNonPII(notBefore.Value), LogHelper.MarkAsNonPII(expires.Value)))
+ {
+ NotBefore = notBefore,
+ Expires = expires
+ });
+
+ DateTime utcNow = DateTime.UtcNow;
+ if (notBefore.HasValue && (notBefore.Value > DateTimeUtil.Add(utcNow, validationParameters.ClockSkew)))
+ throw LogHelper.LogExceptionMessage(new SecurityTokenNotYetValidException(LogHelper.FormatInvariant(LogMessages.IDX10222, LogHelper.MarkAsNonPII(notBefore.Value), LogHelper.MarkAsNonPII(utcNow)))
+ {
+ NotBefore = notBefore.Value
+ });
+
+ if (expires.HasValue && (expires.Value < DateTimeUtil.Add(utcNow, validationParameters.ClockSkew.Negate())))
+ throw LogHelper.LogExceptionMessage(new SecurityTokenExpiredException(LogHelper.FormatInvariant(LogMessages.IDX10223, LogHelper.MarkAsNonPII(expires.Value), LogHelper.MarkAsNonPII(utcNow)))
+ {
+ Expires = expires.Value
+ });
+
+ // if it reaches here, that means lifetime of the token is valid
+ LogHelper.LogInformation(LogMessages.IDX10239);
+ }
+ }
+}
diff --git a/src/Microsoft.IdentityModel.Tokens/Validators.cs b/src/Microsoft.IdentityModel.Tokens/Validators.cs
index 5bb7e07530..ff9a762e12 100644
--- a/src/Microsoft.IdentityModel.Tokens/Validators.cs
+++ b/src/Microsoft.IdentityModel.Tokens/Validators.cs
@@ -455,24 +455,7 @@ public static void ValidateLifetime(DateTime? notBefore, DateTime? expires, Secu
return;
}
- if (!expires.HasValue && validationParameters.RequireExpirationTime)
- throw LogHelper.LogExceptionMessage(new SecurityTokenNoExpirationException(LogHelper.FormatInvariant(LogMessages.IDX10225, LogHelper.MarkAsNonPII(securityToken == null ? "null" : securityToken.GetType().ToString()))));
-
- if (notBefore.HasValue && expires.HasValue && (notBefore.Value > expires.Value))
- throw LogHelper.LogExceptionMessage(new SecurityTokenInvalidLifetimeException(LogHelper.FormatInvariant(LogMessages.IDX10224, LogHelper.MarkAsNonPII(notBefore.Value), LogHelper.MarkAsNonPII(expires.Value)))
- { NotBefore = notBefore, Expires = expires });
-
- DateTime utcNow = DateTime.UtcNow;
- if (notBefore.HasValue && (notBefore.Value > DateTimeUtil.Add(utcNow, validationParameters.ClockSkew)))
- throw LogHelper.LogExceptionMessage(new SecurityTokenNotYetValidException(LogHelper.FormatInvariant(LogMessages.IDX10222, LogHelper.MarkAsNonPII(notBefore.Value), LogHelper.MarkAsNonPII(utcNow)))
- { NotBefore = notBefore.Value });
-
- if (expires.HasValue && (expires.Value < DateTimeUtil.Add(utcNow, validationParameters.ClockSkew.Negate())))
- throw LogHelper.LogExceptionMessage(new SecurityTokenExpiredException(LogHelper.FormatInvariant(LogMessages.IDX10223, LogHelper.MarkAsNonPII(expires.Value), LogHelper.MarkAsNonPII(utcNow)))
- { Expires = expires.Value });
-
- // if it reaches here, that means lifetime of the token is valid
- LogHelper.LogInformation(LogMessages.IDX10239);
+ ValidatorUtilities.ValidateLifetime(notBefore, expires, securityToken, validationParameters);
}
///