Skip to content
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
8685b55
Initial plan
Copilot Jan 13, 2026
eaa9568
Convert delegates to interfaces for validators - Core implementation
Copilot Jan 13, 2026
c22a14d
Update all usages to call interface methods instead of delegates
Copilot Jan 13, 2026
bf0cefe
Add delegate adapters and update test code for interface-based valida…
Copilot Jan 13, 2026
982d813
Fix delegate-to-interface conversion issues in AadValidationParameter…
Copilot Jan 20, 2026
aa52a8b
Merge branch 'dev' into copilot/change-delegate-to-interface
westin-m Jan 20, 2026
4d65904
Fix CS0029 errors: Wrap delegate assignments with interface adapters …
Copilot Jan 21, 2026
a0d56dc
Convert Custom*ValidationDelegates to use interface implementations
Copilot Jan 27, 2026
f1d26e9
Remove backup file
Copilot Jan 27, 2026
6ef27c7
Fix MessageDetail names in throws validators to match method names
Copilot Jan 27, 2026
710116e
Remove delegate adapters, use direct interface implementations
Copilot Jan 27, 2026
ab6c45d
Merge branch 'dev' into copilot/change-delegate-to-interface
westin-m Jan 27, 2026
80437e8
Fix SkipValidationDelegates references in Validators tests
Copilot Jan 27, 2026
db921ad
fix using
westin-m Jan 27, 2026
31b9f23
file renames, api file fixes
westin-m Jan 27, 2026
2c36111
Merge branch 'dev' into copilot/change-delegate-to-interface
westin-m Feb 3, 2026
81f6b93
Merge branch 'dev' into copilot/change-delegate-to-interface
westin-m Feb 10, 2026
1ba9f04
review feedback
westin-m Feb 11, 2026
e1dc208
Merge branch 'copilot/change-delegate-to-interface' of https://github…
westin-m Feb 11, 2026
6cdc7ca
Merge branch 'dev' into copilot/change-delegate-to-interface
westin-m Feb 11, 2026
4a9fd7d
small fix
westin-m Feb 11, 2026
61f509c
Merge branch 'dev' into copilot/change-delegate-to-interface
westin-m Feb 19, 2026
d2fe263
Merge branch 'dev' into copilot/change-delegate-to-interface
westin-m Mar 5, 2026
be2333e
Merge branch 'dev' into copilot/change-delegate-to-interface
westin-m Mar 9, 2026
ee2272f
Merge branch 'dev' into copilot/change-delegate-to-interface
westin-m Mar 9, 2026
28ddc35
Merge branch 'dev' into copilot/change-delegate-to-interface
westin-m Mar 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ internal ValidationResult<string, ValidationError> DecryptToken(
// If no key found in VP, we'll check the configuration.
if (validationParameters.DecryptionKeyResolver != null)
{
keys = validationParameters.DecryptionKeyResolver(jwtToken.EncodedToken, jwtToken, jwtToken.Kid, validationParameters, callContext);
keys = validationParameters.DecryptionKeyResolver.ResolveDecryptionKey(jwtToken.EncodedToken, jwtToken, jwtToken.Kid, validationParameters, callContext);
}
else
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,13 @@ internal static ValidationResult<SecurityKey, ValidationError> ValidateSignature
nameof(validationParameters),
ValidationError.GetCurrentStackFrame());

// Delegate is set by the user, we call it and return the result.
// Validator is set by the user, we call it and return the result.
if (validationParameters.SignatureValidator is not null)
{
try
{
ValidationResult<SecurityKey, ValidationError> signatureValidationResult =
validationParameters.SignatureValidator(
validationParameters.SignatureValidator.ValidateSignature(
jwtToken,
validationParameters,
configuration,
Expand Down Expand Up @@ -79,7 +79,7 @@ internal static ValidationResult<SecurityKey, ValidationError> ValidateSignature
SecurityKey? key = null;
if (validationParameters.SignatureKeyResolver is not null)
{
key = validationParameters.SignatureKeyResolver(
key = validationParameters.SignatureKeyResolver.ResolveSignatureKey(
jwtToken.EncodedToken,
jwtToken,
jwtToken.Kid,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ internal static ValidationResult<string, ValidationError> DecryptJwtToken(
continue;
}

ValidationResult<string, ValidationError> result = validationParameters.AlgorithmValidator(zipAlgorithm, jsonWebToken, validationParameters, callContext);
ValidationResult<string, ValidationError> result = validationParameters.AlgorithmValidator.ValidateAlgorithm(zipAlgorithm, jsonWebToken, validationParameters, callContext);
if (!result.Succeeded)
{
(exceptionStrings ??= new StringBuilder()).AppendLine(result.Error!.MessageDetail.Message);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,12 @@ internal static ValidationResult<SecurityKey, ValidationError> ValidateSignature
ValidationError.GetCurrentStackFrame());
}

// Delegate is set by the user, we call it and return the result.
// Validator is set by the user, we call it and return the result.
if (validationParameters.SignatureValidator is not null)
{
try
{
return validationParameters.SignatureValidator(
return validationParameters.SignatureValidator.ValidateSignature(
securityToken,
validationParameters,
configuration,
Expand Down Expand Up @@ -113,7 +113,7 @@ internal static ValidationResult<SecurityKey, ValidationError> ValidateSignature
SecurityKey key = null;
if (validationParameters.SignatureKeyResolver is not null)
{
key = validationParameters.SignatureKeyResolver(
key = validationParameters.SignatureKeyResolver.ResolveSignatureKey(
canonicalString,
securityToken,
signature.KeyInfo?.Id,
Expand Down
126 changes: 126 additions & 0 deletions src/Microsoft.IdentityModel.Tokens/Experimental/DefaultValidators.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System.Collections.Generic;
using System.Threading.Tasks;
using System.Threading;
using System;

#nullable enable
namespace Microsoft.IdentityModel.Tokens.Experimental
{
/// <summary>
/// Default implementation of <see cref="IAlgorithmValidator"/> that uses the static Validators.ValidateAlgorithm method.
/// </summary>
internal class DefaultAlgorithmValidator : IAlgorithmValidator
Comment thread
westin-m marked this conversation as resolved.
Outdated
{
/// <inheritdoc/>
public ValidationResult<string, ValidationError> ValidateAlgorithm(
string? algorithm,
SecurityToken securityToken,
ValidationParameters validationParameters,
CallContext callContext)
{
return Validators.ValidateAlgorithm(algorithm, securityToken, validationParameters, callContext);
}
}

/// <summary>
/// Default implementation of <see cref="IAudienceValidator"/> that uses the static Validators.ValidateAudience method.
/// </summary>
internal class DefaultAudienceValidator : IAudienceValidator
{
/// <inheritdoc/>
public ValidationResult<string, ValidationError> ValidateAudience(
IList<string> tokenAudiences,
SecurityToken? securityToken,
ValidationParameters validationParameters,
CallContext callContext)
{
return Validators.ValidateAudience(tokenAudiences, securityToken, validationParameters, callContext);
}
}

/// <summary>
/// Default implementation of <see cref="IIssuerValidator"/> that uses the static Validators.ValidateIssuerAsync method.
/// </summary>
internal class DefaultIssuerValidator : IIssuerValidator
{
/// <inheritdoc/>
public Task<ValidationResult<ValidatedIssuer, ValidationError>> ValidateIssuerAsync(
string issuer,
SecurityToken securityToken,
ValidationParameters validationParameters,
CallContext callContext,
CancellationToken cancellationToken)
{
return Validators.ValidateIssuerAsync(issuer, securityToken, validationParameters, callContext, cancellationToken);
}
}

/// <summary>
/// Default implementation of <see cref="ISignatureKeyValidator"/> that uses the static Validators.ValidateSignatureKey method.
/// </summary>
internal class DefaultSignatureKeyValidator : ISignatureKeyValidator
{
/// <inheritdoc/>
public ValidationResult<ValidatedSignatureKey, ValidationError> ValidateSignatureKey(
SecurityKey signingKey,
SecurityToken securityToken,
ValidationParameters validationParameters,
CallContext callContext)
{
return Validators.ValidateSignatureKey(signingKey, securityToken, validationParameters, callContext);
}
}

/// <summary>
/// Default implementation of <see cref="ILifetimeValidator"/> that uses the static Validators.ValidateLifetime method.
/// </summary>
internal class DefaultLifetimeValidator : ILifetimeValidator
{
/// <inheritdoc/>
public ValidationResult<ValidatedLifetime, ValidationError> ValidateLifetime(
DateTime? notBefore,
DateTime? expires,
SecurityToken? securityToken,
ValidationParameters validationParameters,
CallContext callContext)
{
return Validators.ValidateLifetime(notBefore, expires, securityToken, validationParameters, callContext);
}
}

/// <summary>
/// Default implementation of <see cref="ITokenReplayValidator"/> that uses the static Validators.ValidateTokenReplay method.
/// </summary>
internal class DefaultTokenReplayValidator : ITokenReplayValidator
{
/// <inheritdoc/>
public ValidationResult<DateTime?, ValidationError> ValidateTokenReplay(
DateTime? expirationTime,
string securityToken,
ValidationParameters validationParameters,
CallContext callContext)
{
return Validators.ValidateTokenReplay(expirationTime, securityToken, validationParameters, callContext);
}
}

/// <summary>
/// Default implementation of <see cref="ITokenTypeValidator"/> that uses the static Validators.ValidateTokenType method.
/// </summary>
internal class DefaultTokenTypeValidator : ITokenTypeValidator
{
/// <inheritdoc/>
public ValidationResult<ValidatedTokenType, ValidationError> ValidateTokenType(
string? type,
SecurityToken? securityToken,
ValidationParameters validationParameters,
CallContext callContext)
{
return Validators.ValidateTokenType(type, securityToken, validationParameters, callContext);
}
}
}
#nullable restore
171 changes: 0 additions & 171 deletions src/Microsoft.IdentityModel.Tokens/Experimental/Delegates.cs

This file was deleted.

Loading
Loading