Skip to content

Commit 8182762

Browse files
ImdsV2: Additional Acceptance Tests (#5465)
1 parent 7aa4c9d commit 8182762

File tree

3 files changed

+371
-162
lines changed

3 files changed

+371
-162
lines changed

tests/Microsoft.Identity.Test.Common/Core/Mocks/MockHelpers.cs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -595,14 +595,15 @@ public static MsalTokenResponse CreateMsalRunTimeBrokerTokenResponse(string acce
595595
public static MockHttpMessageHandler MockCsrResponse(
596596
HttpStatusCode statusCode = HttpStatusCode.OK,
597597
string responseServerHeader = "IMDS/150.870.65.1854",
598-
UserAssignedIdentityId idType = UserAssignedIdentityId.None,
598+
UserAssignedIdentityId userAssignedIdentityId = UserAssignedIdentityId.None,
599599
string userAssignedId = null)
600600
{
601601
IDictionary<string, string> expectedQueryParams = new Dictionary<string, string>();
602602
IDictionary<string, string> expectedRequestHeaders = new Dictionary<string, string>();
603-
if (idType != UserAssignedIdentityId.None && userAssignedId != null)
603+
604+
if (userAssignedIdentityId != UserAssignedIdentityId.None && userAssignedId != null)
604605
{
605-
var userAssignedIdQueryParam = ImdsManagedIdentitySource.GetUserAssignedIdQueryParam((ManagedIdentityIdType)idType, userAssignedId, null);
606+
var userAssignedIdQueryParam = ImdsManagedIdentitySource.GetUserAssignedIdQueryParam((ManagedIdentityIdType)userAssignedIdentityId, userAssignedId, null);
606607
expectedQueryParams.Add(userAssignedIdQueryParam.Value.Key, userAssignedIdQueryParam.Value.Value);
607608
}
608609
expectedQueryParams.Add("cred-api-version", "2.0");
@@ -642,14 +643,16 @@ public static MockHttpMessageHandler MockCsrResponseFailure()
642643
}
643644

644645
public static MockHttpMessageHandler MockCertificateRequestResponse(
645-
UserAssignedIdentityId idType = UserAssignedIdentityId.None,
646-
string userAssignedId = null)
646+
UserAssignedIdentityId userAssignedIdentityId = UserAssignedIdentityId.None,
647+
string userAssignedId = null,
648+
string certificate = TestConstants.ValidPemCertificate)
647649
{
648650
IDictionary<string, string> expectedQueryParams = new Dictionary<string, string>();
649651
IDictionary<string, string> expectedRequestHeaders = new Dictionary<string, string>();
650-
if (idType != UserAssignedIdentityId.None && userAssignedId != null)
652+
653+
if (userAssignedIdentityId != UserAssignedIdentityId.None && userAssignedId != null)
651654
{
652-
var userAssignedIdQueryParam = ImdsManagedIdentitySource.GetUserAssignedIdQueryParam((ManagedIdentityIdType)idType, userAssignedId, null);
655+
var userAssignedIdQueryParam = ImdsManagedIdentitySource.GetUserAssignedIdQueryParam((ManagedIdentityIdType)userAssignedIdentityId, userAssignedId, null);
653656
expectedQueryParams.Add(userAssignedIdQueryParam.Value.Key, userAssignedIdQueryParam.Value.Value);
654657
}
655658
expectedQueryParams.Add("cred-api-version", ImdsV2ManagedIdentitySource.ImdsV2ApiVersion);
@@ -659,7 +662,7 @@ public static MockHttpMessageHandler MockCertificateRequestResponse(
659662
"{" +
660663
"\"client_id\": \"" + TestConstants.ClientId + "\"," +
661664
"\"tenant_id\": \"" + TestConstants.TenantId + "\"," +
662-
"\"certificate\": \"" + TestConstants.ValidPemCertificate + "\"," +
665+
"\"certificate\": \"" + certificate + "\"," +
663666
"\"identity_type\": \"fake_identity_type\"," + // "SystemAssigned" or "UserAssigned", it doesn't matter for these tests
664667
"\"mtls_authentication_endpoint\": \"" + TestConstants.MtlsAuthenticationEndpoint + "\"," +
665668
"}";
@@ -680,22 +683,29 @@ public static MockHttpMessageHandler MockCertificateRequestResponse(
680683
}
681684

682685
public static MockHttpMessageHandler MockImdsV2EntraTokenRequestResponse(
683-
IdentityLoggerAdapter identityLoggerAdapter)
686+
IdentityLoggerAdapter identityLoggerAdapter,
687+
bool mTLSPop = false)
684688
{
689+
IDictionary<string, string> expectedPostData = new Dictionary<string, string>();
685690
IDictionary<string, string> expectedRequestHeaders = new Dictionary<string, string>
686691
{
687692
{ ThrottleCommon.ThrottleRetryAfterHeaderName, ThrottleCommon.ThrottleRetryAfterHeaderValue }
688693
};
694+
689695
var idParams = MsalIdHelper.GetMsalIdParameters(identityLoggerAdapter);
690696
foreach (var idParam in idParams)
691697
{
692698
expectedRequestHeaders[idParam.Key] = idParam.Value;
693699
}
694700

701+
var tokenType = mTLSPop ? "mtls_pop" : "bearer";
702+
expectedPostData.Add("token_type", tokenType);
703+
695704
var handler = new MockHttpMessageHandler()
696705
{
697706
ExpectedUrl = $"{TestConstants.MtlsAuthenticationEndpoint}/{TestConstants.TenantId}{ImdsV2ManagedIdentitySource.AcquireEntraTokenPath}",
698707
ExpectedMethod = HttpMethod.Post,
708+
ExpectedPostData = expectedPostData,
699709
ExpectedRequestHeaders = expectedRequestHeaders,
700710
ResponseMessage = new HttpResponseMessage(HttpStatusCode.OK)
701711
{

tests/Microsoft.Identity.Test.Common/TestConstants.cs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -585,15 +585,34 @@ public static MsalTokenResponse CreateAadTestTokenResponseWithFoci()
585585
internal const string RefreshToken = "mhJDJ8wtjA3KxpRtuPAreZnMcJ2yKC2JUbpOGbRTdOCImLyQ2B4EIhv8AiA2cCEylZZfZsOsZrNsMBZZAAU9TQYYEO72QcdfnIWpAOeKkud5W2L8nMq6i9dx1EVIl09zFXhOJ79BdFbU0Eb5aUHlcqPCQjec62UKBLkZJmtMnoAa8cjvgIuxTdVM8FNdghe5nlCNTEVooKleTTEHNl2BrdyitLaWTKSP0lRqnFxriG0xWcJoSMsdS7Vt6HZd1TkwHIXycNMlCcCdUh5tOgqx1M8y8uoXK4OJ1LQmtkZvcQWcycvOCPACYakKM1pUQqwTxI6Y4HrL38sqQaSNxpF9OcFxOQWpuGodRekCbxXVbWclttIpvSOLaBhZ2ZBpcCBEeEMSmhqqYgajNwwwe9w88u0UsYKe6PBbaI48ENr02u2qBeLsIQ2HUyKlN3iVmX7u7MhgDWA3NNavMtlLmWd63NfuDgXpLI0O4cLhjAx8uoBIK8LntXPHPTxJ28o0yrszvD4gf7RdhuTq5VE15zne6iAJgIGfy7latGFzxuDMcML9OoXURHnNEHBgS9ZQCfNzYZ2O9flF1UjGpcBLEi7hHVHnrQb4y7c98dz9p62cvEMhorGx9kCwSIkOae5LheXPQkFIbsGyomNEwz3HZvR131VGAwdfmUUodvPr6LAAtmjl4sZ72PRqAo8EdQ0IFsWoypXVv51IooR87tO3uiG2DkxhIAwumOQdaJNxw1a0WS9mpQOmwFlvfbZkaIoUKgagHc8fVa1aHZntLGwH0S1iYixJiIrMnPYAeRdSp9mlHllrMX8xUIznobcZ5i8MpUYCKlUXMZ82S3XUJ5dJxARNRPxXlLJ5LPYBhUNkBLQen9Qmq3VZEV1RDJyhbGp6GAo14KsMtVAVYNmYPIgo85pCZgOwVEOBUycszu4AD3p4PT2ella4LVoqmTTMSA5GEWoeWb5JvEo222Z0oKr7UK8dGwpWRSbg8TNeODihJaTUDfErvbgaZnjIRpqfgtM5i1HfQbD7Yyft5PqyygUra7GYy7pjRrEvq95XQD8sAZ32ku9AqCo5qOB584iX881WErOoheQZokt1txqwuIMUyhVuMKNEXy70CeNTsb30ghQMZpZcXIkrLYyQCZ0gNmARhMKagCSdrpUtxudLk44yfmuwSQzBN3ifWfLZiFpU53qdPLZoTw5";
586586
internal const string IdToken = "6GwdM7f6hHXfivavPozhaRqrbxvEysfXSMQyEKBwVgivPZTtmowsmYygchhIuxjeFFeq1ZPHjhxKFnulrvoY6TDerZY5xyOlg45bToI9Bu95qFvUrrt5r17UJcXdw4YkvEt10CcDDcLcEYw704RpVefvbpjbF24pOgIuafcAkDnbDA0Qea4ePuSC45Lw7zpJhbo9Gh8IfMX597fayBvMs3fh7frrm9KpWMCeKY3h99YSaCYjZFKp1ppvXXPE9bc4sh4pRDOfnv0Yr9J8u4elZevEE4qGddfgd3hYb18XPGRjPEMlWsh7tnwxwUm6OSZlMTHYuvwBENNMx7SUQmMeg4rCfgnbcNDkWpXCiSDVt1lLLv8F2GjYnM6De3v1Ks5lhBWx3grLggcN9LnXz92eJ1l5lTB2v0y9MgmFZ4gY43oIOW5n8G5HOx3bGOyjTw0TKKbyVa3mDj0A3QqW8eLTUJz42BNiGOf5m9prMSlpAW59CHCMJLatsj3IvGeCITsGAr3sUZEytORWUdxCfuIPwecQgU6bO7pNqNvZc1tJHHNwJlfS23ZkiFuEXqEThHYfxBCFxAzMDlzO0TOdWhvrb8hlNeAOcNhoAKxu7HXsePajKs4fU1rcdSxzNKwtASEla3p6jfJnnDtKf38RJZPaRRYMviqqWEMhjmqIvBm7sMaf8RyNNuYl7otZwmwNVCR1hzzmaTAy4kQce67FJqFba7uizrgwp9zsvK8muCHKKPvNthy7fHsxKmrBIm0bLcoePKK3wAID4kFvNQcxXp6rAOr8bLFF3bLEoYdzmF2QJz1frVZZHHPy90Cmlhw48EQN8NE2OllpdaykKt5k4rPcZQyitayNNhism30qh7eCBhcA7mm5Ja0S8X4VPlkwvgwg0mQuul6gakmja8xpnTrwiOdtao320GDmJaJA6zf3UTpNZTq9tdfBtUrjAD8RS0tNUBT3Ko8N2Lfh9ry8y9ESmRVIhch3rKY7UeefFAnkiwH2WwC57ZEsHtMP0SwKYtYKHZW9HkERCCyqOT1Mw0IavsLGFvchzMAvTnz4RwRBk6IrWgANvqT3F3Vexc2K0poKb71XZ4aMXxjqAzydGQAKpKJEJcqEvX9RD8nL76TF2LZIepiaZ3dbQImkqSjbF7aaY2JFoN9ZWlcSQKe8zdO8TIG16bF8W9R4ldDyzV39L33KcweG";
587587

588-
#region Test Certificate and Private Key (ValidPemCertificate & XmlPrivateKey)
588+
#region Test Certificate and Private Key (ExpiredPemCertificate, ValidPemCertificate & XmlPrivateKey)
589589
/// <summary>
590-
/// A test PEM-encoded X.509 certificate and its matching RSA private key.
590+
/// Test (expired and valid) PEM-encoded X.509 certificate and their matching RSA private key.
591591
/// These are used together in unit tests that require both a certificate and its private key.
592-
/// The <see cref="ValidPemCertificate"/> and <see cref="XmlPrivateKey"/> are a matched pair:
593-
/// - <see cref="ValidPemCertificate"/> is a PEM-encoded certificate.
594-
/// - <see cref="XmlPrivateKey"/> is the corresponding RSA private key in XML format.
595-
/// The certificate is valid for 100 years, ensuring it will not expire during the lifetime of the tests.
592+
/// The <see cref="ExpiredPemCertificate"/>/<see cref="ValidPemCertificate"/> and <see cref="XmlPrivateKey"/> are a matched pair:
593+
/// - <see cref="ExpiredPemCertificate"/> is an expired PEM-encoded certificate. The certificate is valid for 1 day and was created on September 8 2025, ensuring it will always be expired.
594+
/// - <see cref="ValidPemCertificate"/> is a valid PEM-encoded certificate. The certificate is valid for 100 years and expires on August 4, 2125, ensuring it will not expire during the lifetime of the tests.
595+
/// - <see cref="XmlPrivateKey"/> is their corresponding RSA private key in XML format.
596596
/// </summary>
597+
internal const string ExpiredPemCertificate = @"-----BEGIN CERTIFICATE-----
598+
MIIC/zCCAeegAwIBAgIUGSVU23Wc0+QtCbUTjsyPOrc0XpEwDQYJKoZIhvcNAQEL
599+
BQAwDzENMAsGA1UEAwwEVGVzdDAeFw0yNTA5MDgyMjAxMTdaFw0yNTA5MDkyMjAx
600+
MTdaMA8xDTALBgNVBAMMBFRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
601+
AoIBAQC5XNEuk3cIEChkZd2P/bljUaVqNVh4mbXdWHYAgbdK48U6rG0FLq1NAfSn
602+
ZO0EPbK8Zo4psRh2lBcqW29/WsKiHUEHLkLyFI+frEIfc8wskd+WxkKfL8G52uRp
603+
YQCG87FIv8uZBBlDG7kDdOV36CUkK1N+V2fHbkEgx+YfWg6+pLi3KQx6Pf/b2YqL
604+
D36hj8WRrVYzL6yXVUBiyRd+cQ9y5V/MRtoiX1Sv8WEFYtzIG0TUGi9pR7WWhgHN
605+
Qk6DFDzutMV62ZEBNPIQvdO2EwXGr1FUIOL6zmj6bArPhY+hCXGrAAwCXodZhgZ9
606+
5BxTwsQWtjCha2hT6ed8zmoE72FdAgMBAAGjUzBRMB0GA1UdDgQWBBQPYq0Efzuv
607+
1diVcgxBxTnVA4wLMjAfBgNVHSMEGDAWgBQPYq0Efzuv1diVcgxBxTnVA4wLMjAP
608+
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCXAD7cjWmmTqP0NX4M
609+
qwO0AHtO+KGVtfxF8aI21Ty/nHh2SAODzsemP3NBBvoEvllwtcVyutPqvUiAflML
610+
Nbp0ucTu+aWE14s1V9Bnt6++5g7gtXItsNV3F/ymYKsyfhDvJbWCOv5qYeJMQ+jt
611+
ODHN9qnATODT5voULTwEVSYQXtutwRxR8e70Cvok+F+4I6Ni49DJ8DmcYzvB94ut
612+
hqpDsygY1vYzpRbB5hpW0/D7kgVVWyWoOWiE1mV7Fry7tUWQw7EqnX89kMLMy4g6
613+
UfOv4gtam8RBa9dLyMW1rCHRxOulP47joI10g9JoJ9DssiQTUojJgQXOSBBXdD20
614+
H+zl
615+
-----END CERTIFICATE-----";
597616
internal const string ValidPemCertificate = @"-----BEGIN CERTIFICATE-----
598617
MIIDATCCAemgAwIBAgIUSfjghyQB4FIS41rWfNcZHTLE/R4wDQYJKoZIhvcNAQEL
599618
BQAwDzENMAsGA1UEAwwEVGVzdDAgFw0yNTA4MjgyMDIxMDBaGA8yMTI1MDgwNDIw

0 commit comments

Comments
 (0)