Skip to content

Commit a120bde

Browse files
FuPingFrancoFranco Fungkeegan-caruso
authored
Adding benchmark for new ValidateTokenAsync model vs old (#2779)
* Adding benchmark for new ValidateTokenAsync model vs old. * Update benchmark/Microsoft.IdentityModel.Benchmarks/ValidateTokenAsyncWithVPTests.cs Co-authored-by: Keegan Caruso <[email protected]> * Updated class naming to be more explicit and added benchmark using clone * Combine and categorize benchmarks into ValidateTokenAsyncTests --------- Co-authored-by: Franco Fung <[email protected]> Co-authored-by: Keegan Caruso <[email protected]>
1 parent 34a421f commit a120bde

File tree

3 files changed

+125
-13
lines changed

3 files changed

+125
-13
lines changed

benchmark/Microsoft.IdentityModel.Benchmarks/Program.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,9 @@ private static void DebugThroughTests()
4848

4949
ValidateTokenAsyncTests validateTokenAsyncTests = new ValidateTokenAsyncTests();
5050
validateTokenAsyncTests.Setup();
51-
TokenValidationResult tokenValidationResult = validateTokenAsyncTests.JsonWebTokenHandler_ValidateTokenAsync().Result;
52-
var claims = validateTokenAsyncTests.JsonWebTokenHandler_ValidateTokenAsync_CreateClaims();
51+
TokenValidationResult tokenValidationResult = validateTokenAsyncTests.JsonWebTokenHandler_ValidateTokenAsyncWithTVP().Result;
52+
TokenValidationResult validationResult = validateTokenAsyncTests.JsonWebTokenHandler_ValidateTokenAsyncWithVP().Result;
53+
var claims = validateTokenAsyncTests.JsonWebTokenHandler_ValidateTokenAsyncWithTVP_CreateClaims();
5354

5455
ValidateSignedHttpRequestAsyncTests validateSignedHttpRequestAsyncTests = new ValidateSignedHttpRequestAsyncTests();
5556
validateSignedHttpRequestAsyncTests.Setup();

benchmark/Microsoft.IdentityModel.Benchmarks/ValidateTokenAsyncTests.cs

Lines changed: 121 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,28 @@
77
using System.Security.Claims;
88
using System.Threading.Tasks;
99
using BenchmarkDotNet.Attributes;
10+
using BenchmarkDotNet.Configs;
1011
using Microsoft.IdentityModel.JsonWebTokens;
1112
using Microsoft.IdentityModel.Tokens;
1213

1314
namespace Microsoft.IdentityModel.Benchmarks
1415
{
1516
// dotnet run -c release -f net8.0 --filter Microsoft.IdentityModel.Benchmarks.ValidateTokenAsyncTests*
1617

18+
[GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)]
1719
public class ValidateTokenAsyncTests
1820
{
21+
private CallContext _callContext;
1922
private JsonWebTokenHandler _jsonWebTokenHandler;
2023
private JwtSecurityTokenHandler _jwtSecurityTokenHandler;
2124
private SecurityTokenDescriptor _tokenDescriptor;
2225
private SecurityTokenDescriptor _tokenDescriptorExtendedClaims;
2326
private string _jws;
2427
private string _jwsExtendedClaims;
25-
private TokenValidationParameters _validationParameters;
28+
private TokenValidationParameters _tokenValidationParameters;
29+
private TokenValidationParameters _invalidTokenValidationParameters;
30+
private ValidationParameters _validationParameters;
31+
private ValidationParameters _invalidValidationParameters;
2632

2733
[GlobalSetup]
2834
public void Setup()
@@ -46,29 +52,133 @@ public void Setup()
4652
_jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
4753
_jwtSecurityTokenHandler.SetDefaultTimesOnTokenCreation = false;
4854

49-
_validationParameters = new TokenValidationParameters()
55+
_tokenValidationParameters = new TokenValidationParameters()
5056
{
5157
ValidAudience = BenchmarkUtils.Audience,
5258
ValidateLifetime = true,
5359
ValidIssuer = BenchmarkUtils.Issuer,
5460
IssuerSigningKey = BenchmarkUtils.SigningCredentialsRsaSha256.Key,
5561
};
62+
63+
_validationParameters = new ValidationParameters();
64+
_validationParameters.ValidAudiences.Add(BenchmarkUtils.Audience);
65+
_validationParameters.ValidIssuers.Add(BenchmarkUtils.Issuer);
66+
_validationParameters.IssuerSigningKeys.Add(BenchmarkUtils.SigningCredentialsRsaSha256.Key);
67+
68+
_invalidTokenValidationParameters = new TokenValidationParameters()
69+
{
70+
ValidAudience = BenchmarkUtils.Audience,
71+
ValidateLifetime = true,
72+
ValidIssuer = BenchmarkUtils.Issuer,
73+
ValidateIssuerSigningKey = true,
74+
ValidateTokenReplay = true,
75+
ValidateSignatureLast = true
76+
};
77+
78+
_invalidValidationParameters = new ValidationParameters();
79+
_invalidValidationParameters.ValidAudiences.Add(BenchmarkUtils.Audience);
80+
_invalidValidationParameters.ValidIssuers.Add(BenchmarkUtils.Issuer);
81+
82+
_callContext = new CallContext();
83+
}
84+
85+
[BenchmarkCategory("ValidateTokenAsyncWithTokenValidationParameters"), Benchmark]
86+
public async Task<TokenValidationResult> JwtSecurityTokenHandler_ValidateTokenAsync() => await _jwtSecurityTokenHandler.ValidateTokenAsync(_jws, _tokenValidationParameters).ConfigureAwait(false);
87+
88+
[BenchmarkCategory("ValidateTokenAsyncWithTokenValidationParameters"), Benchmark(Baseline = true)]
89+
public async Task<TokenValidationResult> JsonWebTokenHandler_ValidateTokenAsyncWithTVP() => await _jsonWebTokenHandler.ValidateTokenAsync(_jws, _tokenValidationParameters).ConfigureAwait(false);
90+
91+
[BenchmarkCategory("ValidateTokenAsyncWithTokenValidationParameters"), Benchmark]
92+
public async Task<TokenValidationResult> JsonWebTokenHandler_ValidateTokenAsyncWithTVPUsingModifiedClone()
93+
{
94+
var tokenValidationParameters = _tokenValidationParameters.Clone();
95+
tokenValidationParameters.ValidIssuer = "different-issuer";
96+
tokenValidationParameters.ValidAudience = "different-audience";
97+
tokenValidationParameters.ValidateLifetime = false;
98+
return await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, tokenValidationParameters).ConfigureAwait(false);
99+
}
100+
101+
[BenchmarkCategory("ValidateTokenAsyncWithTokenValidationParameters"), Benchmark]
102+
public async Task<TokenValidationResult> JsonWebTokenHandler_ValidateTokenAsyncWithTVP_SucceedOnThirdAttempt()
103+
{
104+
TokenValidationResult result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidTokenValidationParameters).ConfigureAwait(false);
105+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidTokenValidationParameters).ConfigureAwait(false);
106+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _tokenValidationParameters).ConfigureAwait(false);
107+
108+
return result;
109+
}
110+
111+
[BenchmarkCategory("ValidateTokenAsyncWithTokenValidationParameters"), Benchmark]
112+
public async Task<TokenValidationResult> JsonWebTokenHandler_ValidateTokenAsyncWithTVPUsingClone_SucceedOnThirdAttempt()
113+
{
114+
TokenValidationResult result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidTokenValidationParameters.Clone()).ConfigureAwait(false);
115+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidTokenValidationParameters.Clone()).ConfigureAwait(false);
116+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _tokenValidationParameters.Clone()).ConfigureAwait(false);
117+
118+
return result;
56119
}
57120

58-
[Benchmark]
59-
public async Task<List<Claim>> JsonWebTokenHandler_ValidateTokenAsync_CreateClaims()
121+
[BenchmarkCategory("ValidateTokenAsyncWithTokenValidationParameters"), Benchmark]
122+
public async Task<TokenValidationResult> JsonWebTokenHandler_ValidateTokenAsyncWithTVP_SucceedOnFifthAttempt()
60123
{
61-
var result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _validationParameters).ConfigureAwait(false);
124+
TokenValidationResult result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidTokenValidationParameters).ConfigureAwait(false);
125+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidTokenValidationParameters).ConfigureAwait(false);
126+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidTokenValidationParameters).ConfigureAwait(false);
127+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidTokenValidationParameters).ConfigureAwait(false);
128+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _tokenValidationParameters).ConfigureAwait(false);
129+
130+
return result;
131+
}
132+
133+
[BenchmarkCategory("ValidateTokenAsyncWithTokenValidationParameters"), Benchmark]
134+
public async Task<TokenValidationResult> JsonWebTokenHandler_ValidateTokenAsyncWithTVPUsingClone_SucceedOnFifthAttempt()
135+
{
136+
TokenValidationResult result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidTokenValidationParameters.Clone()).ConfigureAwait(false);
137+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidTokenValidationParameters.Clone()).ConfigureAwait(false);
138+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidTokenValidationParameters.Clone()).ConfigureAwait(false);
139+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidTokenValidationParameters.Clone()).ConfigureAwait(false);
140+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _tokenValidationParameters.Clone()).ConfigureAwait(false);
141+
142+
return result;
143+
}
144+
145+
[BenchmarkCategory("ValidateTokenAsyncWithValidationParameters"), Benchmark(Baseline = true)]
146+
public async Task<TokenValidationResult> JsonWebTokenHandler_ValidateTokenAsyncWithVP() => await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _validationParameters, _callContext, null).ConfigureAwait(false);
147+
148+
[BenchmarkCategory("ValidateTokenAsyncWithValidationParameters"), Benchmark]
149+
public async Task<TokenValidationResult> JsonWebTokenHandler_ValidateTokenAsyncWithVP_SucceedOnThirdAttempt()
150+
{
151+
var result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidValidationParameters, _callContext, null).ConfigureAwait(false);
152+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidValidationParameters, _callContext, null).ConfigureAwait(false);
153+
return await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _validationParameters, _callContext, null).ConfigureAwait(false);
154+
}
155+
156+
[BenchmarkCategory("ValidateTokenAsyncWithValidationParameters"), Benchmark]
157+
public async Task<TokenValidationResult> JsonWebTokenHandler_ValidateTokenAsyncWithVP_SucceedOnFifthAttempt()
158+
{
159+
var result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidValidationParameters, _callContext, null).ConfigureAwait(false);
160+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidValidationParameters, _callContext, null).ConfigureAwait(false);
161+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidValidationParameters, _callContext, null).ConfigureAwait(false);
162+
result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _invalidValidationParameters, _callContext, null).ConfigureAwait(false);
163+
return await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _validationParameters, _callContext, null).ConfigureAwait(false);
164+
}
165+
166+
[BenchmarkCategory("ValidateTokenAsyncClaimAccess"), Benchmark]
167+
public async Task<List<Claim>> JsonWebTokenHandler_ValidateTokenAsyncWithVP_CreateClaims()
168+
{
169+
var result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _validationParameters, _callContext, null).ConfigureAwait(false);
62170
var claimsIdentity = result.ClaimsIdentity;
63171
var claims = claimsIdentity.Claims;
64172
return claims.ToList();
65173
}
66174

67-
[Benchmark]
68-
public async Task<TokenValidationResult> JsonWebTokenHandler_ValidateTokenAsync() => await _jsonWebTokenHandler.ValidateTokenAsync(_jws, _validationParameters).ConfigureAwait(false);
69-
70-
[Benchmark]
71-
public async Task<TokenValidationResult> JwtSecurityTokenHandler_ValidateTokenAsync() => await _jwtSecurityTokenHandler.ValidateTokenAsync(_jws, _validationParameters).ConfigureAwait(false);
72-
175+
[BenchmarkCategory("ValidateTokenAsyncClaimAccess"), Benchmark]
176+
public async Task<List<Claim>> JsonWebTokenHandler_ValidateTokenAsyncWithTVP_CreateClaims()
177+
{
178+
var result = await _jsonWebTokenHandler.ValidateTokenAsync(_jwsExtendedClaims, _tokenValidationParameters).ConfigureAwait(false);
179+
var claimsIdentity = result.ClaimsIdentity;
180+
var claims = claimsIdentity.Claims;
181+
return claims.ToList();
182+
}
73183
}
74184
}

src/Microsoft.IdentityModel.JsonWebTokens/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@
1818
[assembly: InternalsVisibleTo("Microsoft.IdentityModel.S2S.Tokens, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")]
1919
[assembly: InternalsVisibleTo("Microsoft.IdentityModel.S2S.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")]
2020
[assembly: InternalsVisibleTo("Microsoft.IdentityModel.S2S.Tokens.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")]
21+
[assembly: InternalsVisibleTo("Microsoft.IdentityModel.Benchmarks, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")]

0 commit comments

Comments
 (0)