Skip to content

Commit eb0daac

Browse files
iNinjamsbw2
andauthored
Avoid code duplication in extensibility testing (#3041)
* Modified ValidateTokenAsync in SAML and SAML2 token handlers to receive SecurityToken instead of Saml(2)SecurityToken * Added test interface to unify JsonWebTokenHandler, SamlSecurityTokenHandler and Saml2SecurityTokenHandler's ValidateTokenAsync and CreateToken methods under a shared API * Added ExtensibilityTheoryData as the base for all extensibility theory data. Added ValidateTokenAsyncExtensibility to test all extensibility aspects across JWT, SAML, and SAML2 * Added issuer specific theory data and extensibility test cases * Removed all duplicated code in issuer extensibility testing across JWT, SAML, and SAML2 using the new test classes * Apply suggestions from code review Co-authored-by: msbw2 <[email protected]> * Apply suggestions from code review --------- Co-authored-by: msbw2 <[email protected]>
1 parent ae57a3c commit eb0daac

File tree

12 files changed

+556
-781
lines changed

12 files changed

+556
-781
lines changed

src/Microsoft.IdentityModel.Tokens.Saml/InternalAPI.Unshipped.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ Microsoft.IdentityModel.Tokens.Saml.SamlSecurityTokenHandler.ValidatedConditions
88
Microsoft.IdentityModel.Tokens.Saml.SamlSecurityTokenHandler.ValidatedConditions.ValidatedConditions(string ValidatedAudience, Microsoft.IdentityModel.Tokens.ValidatedLifetime? ValidatedLifetime) -> void
99
Microsoft.IdentityModel.Tokens.Saml.SamlSecurityTokenHandler.ValidatedConditions.ValidatedLifetime.get -> Microsoft.IdentityModel.Tokens.ValidatedLifetime?
1010
Microsoft.IdentityModel.Tokens.Saml.SamlSecurityTokenHandler.ValidatedConditions.ValidatedLifetime.set -> void
11-
Microsoft.IdentityModel.Tokens.Saml.SamlSecurityTokenHandler.ValidateTokenAsync(Microsoft.IdentityModel.Tokens.Saml.SamlSecurityToken samlToken, Microsoft.IdentityModel.Tokens.ValidationParameters validationParameters, Microsoft.IdentityModel.Tokens.CallContext callContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.IdentityModel.Tokens.ValidationResult<Microsoft.IdentityModel.Tokens.ValidatedToken>>
11+
Microsoft.IdentityModel.Tokens.Saml.SamlSecurityTokenHandler.ValidateTokenAsync(Microsoft.IdentityModel.Tokens.SecurityToken securityToken, Microsoft.IdentityModel.Tokens.ValidationParameters validationParameters, Microsoft.IdentityModel.Tokens.CallContext callContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.IdentityModel.Tokens.ValidationResult<Microsoft.IdentityModel.Tokens.ValidatedToken>>
1212
Microsoft.IdentityModel.Tokens.Saml.SamlSecurityTokenHandler.ValidateTokenAsync(string token, Microsoft.IdentityModel.Tokens.ValidationParameters validationParameters, Microsoft.IdentityModel.Tokens.CallContext callContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.IdentityModel.Tokens.ValidationResult<Microsoft.IdentityModel.Tokens.ValidatedToken>>
1313
Microsoft.IdentityModel.Tokens.Saml.SamlValidationError
1414
Microsoft.IdentityModel.Tokens.Saml.SamlValidationError.SamlValidationError(Microsoft.IdentityModel.Tokens.MessageDetail messageDetail, Microsoft.IdentityModel.Tokens.ValidationFailureType validationFailureType, System.Type exceptionType, System.Diagnostics.StackFrame stackFrame, System.Exception innerException = null) -> void
1515
Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.StackFrames
16-
Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.ValidateTokenAsync(Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityToken samlToken, Microsoft.IdentityModel.Tokens.ValidationParameters validationParameters, Microsoft.IdentityModel.Tokens.CallContext callContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.IdentityModel.Tokens.ValidationResult<Microsoft.IdentityModel.Tokens.ValidatedToken>>
16+
Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.ValidateTokenAsync(Microsoft.IdentityModel.Tokens.SecurityToken securityToken, Microsoft.IdentityModel.Tokens.ValidationParameters validationParameters, Microsoft.IdentityModel.Tokens.CallContext callContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.IdentityModel.Tokens.ValidationResult<Microsoft.IdentityModel.Tokens.ValidatedToken>>
1717
Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.ValidateTokenAsync(string token, Microsoft.IdentityModel.Tokens.ValidationParameters validationParameters, Microsoft.IdentityModel.Tokens.CallContext callContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.IdentityModel.Tokens.ValidationResult<Microsoft.IdentityModel.Tokens.ValidatedToken>>
1818
Microsoft.IdentityModel.Tokens.Saml2.Saml2ValidationError
1919
Microsoft.IdentityModel.Tokens.Saml2.Saml2ValidationError.Saml2ValidationError(Microsoft.IdentityModel.Tokens.MessageDetail messageDetail, Microsoft.IdentityModel.Tokens.ValidationFailureType validationFailureType, System.Type exceptionType, System.Diagnostics.StackFrame stackFrame, System.Exception innerException = null) -> void
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Microsoft.IdentityModel.TestUtils, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")]
5+

src/Microsoft.IdentityModel.Tokens.Saml/Saml/SamlSecurityTokenHandler.ValidateToken.Internal.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,34 @@ internal async Task<ValidationResult<ValidatedToken>> ValidateTokenAsync(
3535
}
3636

3737
internal async Task<ValidationResult<ValidatedToken>> ValidateTokenAsync(
38-
SamlSecurityToken samlToken,
38+
SecurityToken securityToken,
3939
ValidationParameters validationParameters,
4040
CallContext callContext,
4141
#pragma warning disable CA1801 // Review unused parameters
4242
CancellationToken cancellationToken)
4343
#pragma warning restore CA1801 // Review unused parameters
4444
{
45-
if (samlToken is null)
45+
if (securityToken is null)
4646
{
4747
StackFrames.TokenNull ??= new StackFrame(true);
4848
return ValidationError.NullParameter(
49-
nameof(samlToken),
49+
nameof(securityToken),
5050
StackFrames.TokenNull);
5151
}
5252

53+
if (securityToken is not SamlSecurityToken samlToken)
54+
{
55+
return new ValidationError(
56+
new MessageDetail(
57+
LogMessages.IDX11400,
58+
this,
59+
typeof(SamlSecurityToken),
60+
securityToken.GetType()),
61+
ValidationFailureType.InvalidSecurityToken,
62+
typeof(SecurityTokenArgumentException),
63+
ValidationError.GetCurrentStackFrame());
64+
}
65+
5366
if (validationParameters is null)
5467
{
5568
StackFrames.TokenValidationParametersNull ??= new StackFrame(true);

src/Microsoft.IdentityModel.Tokens.Saml/Saml2/Saml2SecurityTokenHandler.ValidateToken.Internal.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,32 @@ internal async Task<ValidationResult<ValidatedToken>> ValidateTokenAsync(
3636
}
3737

3838
internal async Task<ValidationResult<ValidatedToken>> ValidateTokenAsync(
39-
Saml2SecurityToken samlToken,
39+
SecurityToken securityToken,
4040
ValidationParameters validationParameters,
4141
CallContext callContext,
4242
CancellationToken cancellationToken)
4343
{
44-
if (samlToken is null)
44+
if (securityToken is null)
4545
{
4646
StackFrames.TokenNull ??= new StackFrame(true);
4747
return ValidationError.NullParameter(
48-
nameof(samlToken),
48+
nameof(securityToken),
4949
StackFrames.TokenNull);
5050
}
5151

52+
if (securityToken is not Saml2SecurityToken samlToken)
53+
{
54+
return new ValidationError(
55+
new MessageDetail(
56+
Tokens.Saml.LogMessages.IDX11400,
57+
this,
58+
typeof(Saml2SecurityToken),
59+
securityToken.GetType()),
60+
ValidationFailureType.InvalidSecurityToken,
61+
typeof(SecurityTokenArgumentException),
62+
ValidationError.GetCurrentStackFrame());
63+
}
64+
5265
if (validationParameters is null)
5366
{
5467
StackFrames.TokenValidationParametersNull ??= new StackFrame(true);

0 commit comments

Comments
 (0)