Skip to content

Commit 18ff324

Browse files
authored
Labmigration (#5558)
* Complete Key Vault migration with ObjectId validation - Enhanced LabUserHelper with GetKVLabData and MergeKVLabData methods for direct Key Vault access - Added multi-secret merging system combining MSAL-User-Default-JSON, ID4SLAB1, and MSAL-App-Default-JSON - Updated FetchUserPassword to use KeyVaultSecretsProviderMsid for direct password retrieval - Extended FederationProvider enum with ADFSv2022 support, removed adfs2019 - Implemented comprehensive ObjectId validation against Azure AD source of truth - Fixed ByRefreshTokenTestAsync failure by correcting ObjectId mismatch in Key Vault secrets - All user and app ObjectIds now verified and aligned between Key Vault and Azure AD - Key Vault integration fully functional with 14/18 tests passing (4 failures due to Azure AD app consent/registration issues) - Complete migration from lab service API dependency to direct Azure Key Vault access * Complete Key Vault migration and update OnBehalfOf tests - Updated LabUserHelper with GetKVLabData and MergeKVLabData methods for complete Key Vault integration - Modified TestConstants to use new app ID and Key Vault secret names - Updated ConfidentialAppSettings to use ID4S Key Vault and new app configuration - Changed OnBehalfOfTests and LongRunningOnBehalfOfTests to use new app ID and default user method - All test configurations now point to consolidated app ID 54a2d933-8bf8-483b-a8f8-0a31924f3c1f - Key Vault integration successfully retrieves and merges secrets from multiple vaults - Assigned LabVaultAccess_UAMI to SLVM build agent for MI E2E test support * Enhance lab infrastructure with debug logging and ADFS 2022 support - Add comprehensive debug logging to LabUserHelper for user/app/lab retrieval tracking - Create GetDefaultAdfsUserAsync() method using MSAL-USER-FedDefault-JSON Key Vault secret - Update OnBehalfOfTests to use GetDefaultUserAsync()/GetDefaultUser2Async() instead of hardcoded emails - Standardize ADFS test method names (remove version-specific naming) - Add TLS 1.3 configuration for ADFS 2022 connectivity in integration tests - Update all ADFS tests to use new GetDefaultAdfsUserAsync() method - Improve error handling and diagnostics throughout lab infrastructure * Update UsernamePasswordIntegrationTests.NetFwk.cs with additional improvements * Align UsernamePasswordIntegrationTests.NetFwk.cs with main branch - correct method names and lab helper calls * Restore complete LabMigration version of UsernamePasswordIntegrationTests.NetFwk.cs with all original tests and enhanced LabUserHelper calls * Update LabUserHelper calls to use LabMigration enhanced methods while keeping main branch test structure * Fix GetHybridSpaAccontAsync to use Key Vault approach instead of old lab API - resolves idlab1@msidlab4 user issue * Complete migration to new lab infrastructure - Updated all user references from msidlab4.onmicrosoft.com to id4slab1.onmicrosoft.com - Updated UserQueryParameters.cs with new user UPNs (MSAL-User-Default, MSAL-User-Default2, MSAL-User-XCG) - Enhanced CacheExecutionTests.cs to use LabUserHelper.GetDefaultUserAsync() instead of old lab API - Updated all unit test data in JsonHelperTests.cs, IdTokenParsingTests.cs, AADTestData.txt, UnifiedSchemaValidationTests.cs - Updated RuntimeBrokerTests.cs POP user references to [email protected] - Updated dev app references in NetWSLWam, MSIX README, and MauiApp - Migrated all federation metadata from fs.msidlab4.com to fs.id4slab1.com - Updated MSIX README to reference Azure Portal Key Vault link for password retrieval - All changes align with LabMigration Key Vault approach using enhanced LabUserHelper methods * Fix failing tests in labmigration branch - Fix UnifiedSchemaValidationTests to expect lowercase usernames iOS cache key generation applies ToLowerInvariant() which converts usernames to lowercase, updated test expectations accordingly - Customize IdTokenParsingTests with msal-user-default values Added new CreateAadTestTokenResponseWithMsalUserDefault() method to TestConstants.cs with custom JWT payload containing desired test values instead of real idlab token data - All previously failing tests now pass (23 passed, 1 skipped) Fixes test compatibility issues and provides custom test scenarios as requested for improved test coverage and maintenance. * Fix CacheCompat test compilation errors Update CacheExecutionTests.cs to use new lab infrastructure API: - Changed labUser.Upn to labUser.User.Upn - Changed labUser.GetOrFetchPassword() to labUser.User.GetOrFetchPassword() - Changed labUser.AppId to labUser.App.AppId - Changed labUser.TenantId to labUser.User.TenantId This aligns with the lab migration changes where properties are now accessed through User and App objects instead of directly on LabResponse. * Trigger pipeline rebuild with latest changes * Migrate integration tests from MSIDLAB4 to id4slab1 tenant - Updated ConfidentialAppSettings.cs with new tenant ID (10c419d4-4a50-45b2-aa4e-919fb84df24f) and client ID (54a2d933-8bf8-483b-a8f8-0a31924f3c1f) - Updated TestConstants.cs to use id4slab1 tenant for confidential client tests - Updated ClientCredentialsTests.WithRegion.cs to use new tenant and client configurations - Updated OnBehalfOfTests.cs to use migrated tenant settings - Updated PoPTests.NetFwk.cs to use new confidential client configuration Migration results: 90/150 tests passing (60% success rate) with core authentication scenarios working. Remaining issues: Some OBO tests failing with AADSTS7000218 errors requiring KeyVault secret configuration. * Complete MSAL.NET OBO integration test migration to ID4SLAB1 tenant - Fix OnBehalfOfTests regional test configuration to use migrated ID4SLAB1 tenant - Update LongRunningOnBehalfOfTests scope from legacy to current OBO service - Configure MSAL-APP-AzureADMultipleOrgs secret for migrated app authentication - Enable public client flows for username/password authentication scenarios - Add proper Azure AD permissions for OBO service access_as_user delegated permissions All 14 OBO integration tests now pass (100% success rate, up from 14% initially) PoP tests also fixed with proper client secret configuration * Migrate ADFS tests from fs.msidlab8.com to fs.id4slab1.com - Updated AcquireTokenFromAdfsUsernamePasswordAsync to use GetDefaultAdfsUserAsync() and new ADFS 2022 infrastructure - Updated ROPC_ADFSv4Federated_Async to use dynamic lab response instead of hardcoded constants - Migrated ConfidentialAppSettings to use new fs.id4slab1.com authority and dynamic app configuration - Updated Selenium interactive tests to use new ADFS authority with validation disabled - All ADFS tests now pass consistently with Fed1-only load balancer configuration - Fixes intermittent SSL handshake failures by using stable ADFS 2022 infrastructure * Add missing CreateAadTestTokenResponseWithMsalUserDefault method - Fixes compilation error in IdTokenParsingTests.cs - Adds method to create token response with MSAL User Default user data - Uses ID4SLAB1 tenant information matching the new infrastructure - Method follows same pattern as other CreateAadTestTokenResponse methods * Fix tenant routing issue by using multi-tenant app for integration tests - Changed ConfidentialClientID from single-tenant app (35dc5034-9b65-4a5d-ad81-73cca468c1e0) to multi-tenant app (54a2d933-8bf8-483b-a8f8-0a31924f3c1f) - Resolves AADSTS700016 'Application not found in directory' errors when using /common authority - Multi-tenant app can handle both /common and tenant-specific authorities properly - Uses same LabAuth certificate for authentication * Fix HybridSPA test to use multi-tenant app and clean up whitespace - Updated GetTokenByAuthCode_HybridSPA_Async to use ConfidentialClientID instead of labResponse.App.AppId - Removed trailing whitespace to prevent merge conflicts - This should resolve AADSTS700016 errors in the HybridSPA test * Clean up trailing whitespace in commented code - Updated commented tenant ID references to match the corrected tenant - Ensures consistency in both active and commented code sections * Fix device code flow tests to use tenant-specific authority - Updated DeviceCodeFlowTestAsync and SilentTokenAfterDeviceCodeFlowWithBrokerTestAsync - Changed from default /common authority to tenant-specific authority using labResponse.User.TenantId - Resolves AADSTS50059 errors when using single-tenant apps with device code flow - Applies to both regular and broker-enabled device code scenarios * Add GetDefaultUserWithMultiTenantAppAsync method and update device code flow tests - Added LabUserHelper.GetDefaultUserWithMultiTenantAppAsync() using MSAL-APP-AzureADMultipleOrgs KeyVault secret - Updated DeviceCodeFlowTestAsync and SilentTokenAfterDeviceCodeFlowWithBrokerTestAsync to use new method - Removed hardcoded PublicClientID constant in favor of proper LabResponse pattern - Now uses labResponse.App.AppId which contains multi-tenant app 54a2d933-8bf8-483b-a8f8-0a31924f3c1f - Resolves AADSTS50059 errors by using multi-tenant app that supports /common authority - Follows same pattern as other LabUserHelper methods for consistency * Fix AADSTS700016 errors by migrating to multi-tenant app configuration - Add GetDefaultUserWithMultiTenantAppAsync() method to LabUserHelper - Update ConfidentialClientAuthorizationTests to use multi-tenant app - Create MSAL-APP-AzureADMultipleOrgs-JSON KeyVault secret with proper JSON structure - Replace hardcoded app IDs with multi-tenant app ID 54a2d933-8bf8-483b-a8f8-0a31924f3c1f - Resolves tenant routing issues with /common authority endpoint The multi-tenant app (AzureADMultipleOrgs) is compatible with /common authority, eliminating AADSTS700016 tenant routing conflicts that were causing test failures. * Fix additional tests using default user instead of multi-tenant app - Update InteractiveFlowTests.NetFwk.cs Interactive_AADAsync to use GetDefaultUserWithMultiTenantAppAsync - Update PoPTests.NetFwk.cs ROPC_PopTestWithRSAAsync to use GetDefaultUserWithMultiTenantAppAsync - Resolves AADSTS50194 errors for tests using /common endpoint with single-tenant app - Ensures consistent multi-tenant app usage across all affected tests * Fix more tests using /common endpoint with single-tenant app - Update InteractiveFlowTests ValidateCcsHeadersForInteractiveAuthCodeFlowAsync - Update InstanceDiscoveryIntegrationTests FailedAuthorityValidationTestAsync - Update InstanceDiscoveryIntegrationTests AuthorityValidationTestWithFalseValidateAuthorityAsync - All tests using /common endpoint now use multi-tenant app configuration - Prevents AADSTS50194 errors for single-tenant app + /common authority mismatch * Final migration updates - OBO tests and interactive flow fixes - Updated OnBehalfOfTests.cs and LongRunningOnBehalfOfTests.cs to use multi-tenant app configuration - Refined ConfidentialClientAuthorizationTests.cs and InteractiveFlowTests.NetFwk.cs - Added pipeline log analysis file (60.txt) for debugging reference - All AADSTS errors resolved through systematic multi-tenant app migration - Verified test integrity preserved during lab infrastructure migration * Fix interactive tests to use correct app configuration - Changed Interactive_AADAsync to use GetDefaultUserAsync() instead of GetDefaultUserWithMultiTenantAppAsync() - Fixed InteractiveConsentPromptAsync to use default app - Fixed ValidateCcsHeadersForInteractiveAuthCodeFlowAsync to use default app - Interactive tests should use public client apps, not the multi-tenant confidential app - This resolves AADSTS7000218 errors (missing client_secret for confidential clients) * Remove Selenium.WebDriver.ChromeDriver package reference to match main branch * Optimize OBO test initialization - remove redundant GetDefaultUserWithMultiTenantAppAsync calls - Remove redundant TestInitializeAsync calls to GetDefaultUserWithMultiTenantAppAsync() - Update test methods to call lab API only once instead of twice per test - Change TestInitialize methods from async to synchronous - Remove unused _multiTenantAppId fields - Improve RunOnBehalfOfTestAsync helper with optional parameter - Reduce test execution time and lab API load by ~50% - All 21 OBO tests verified passing * Address PR feedback for GetKVLabData method - improve type safety and async patterns - Change GetKVLabData return type from object to strongly-typed LabResponse - Make GetKVLabDataAsync method private (was public) - Add proper Async suffix to method name (GetKVLabData -> GetKVLabDataAsync) - Add async Key Vault operations: GetSecretByNameAsync methods to KeyVaultSecretsProvider - Make GetKVLabDataAsync properly async with await instead of Task.FromResult pattern - Update all callers to use new MergeKVLabDataAsync method - Improve error handling and remove object casting - Better performance with non-blocking Key Vault I/O operations - All builds and tests verified passing * Optimize JSON parsing in GetKVLabDataAsync - eliminate duplicate parsing - Remove IsValidJson helper method that was parsing JSON twice - Parse JSON directly with JsonConvert.DeserializeObject and handle JsonException - Better performance by avoiding redundant JSON parsing operations - More precise error handling with specific JsonException vs generic exceptions - Maintain same error messaging and logging behavior - All builds and tests verified passing Addresses PR feedback: 'If it's invalid JSON, throw an exception. No need to reparse.' * Clean up OnBehalfOfTests.cs - Remove outdated migration comment - Removed comment about ID4SLAB1 tenant migration from line 518 - Comment was no longer relevant after migration completion * Refactor ConfidentialAppSettings for Single Responsibility Principle - Changed IConfidentialAppSettings interface from methods to properties - GetSecret() → Secret property with lazy loading - GetCertificate() → Certificate property with lazy loading - Updated all 5 concrete implementations with property syntax - Fixed 9 test files to use property access instead of method calls - Removed helper methods GetClientCredentials() and GetClientSecret() - Eliminated SRP violations by encapsulating coordination complexity - Maintained backward compatibility and performance with lazy loading - All compilation errors resolved (29 → 0), builds successfully This refactoring improves code maintainability by removing the need for callers to coordinate GetSettings() + GetSecret() calls, following the Single Responsibility Principle where each class has one clear purpose. * Fix remaining CI/CD compilation errors - complete SRP refactoring - Updated NetCoreTestApp/Program.cs: GetCertificate() → Certificate property - Updated TestTelemetry/Program.cs: GetCertificate() → Certificate property - Updated RegionalTestApp/Program.cs: GetCertificate() → Certificate property All IConfidentialAppSettings interface method calls now use property-based API. SRP refactoring fully complete with zero compilation errors. * Fix NetCoreTestApp to use multi-tenant app from lab - Use LabUserHelper.GetDefaultUserWithMultiTenantAppAsync() to get correct multi-tenant app ID - Resolves AADSTS50194 error when using /common endpoint with single-tenant app - Ensures proper multi-tenant configuration for testing scenarios - Added LabInfrastructure using statement for lab integration * Test: Change Interactive_AADAsync to use multi-tenant app - Modified Interactive_AADAsync test to use GetDefaultUserWithMultiTenantAppAsync() instead of GetDefaultUserAsync() - This will test multi-tenant app configuration in the CI pipeline where ChromeDriver is properly set up - Local testing confirmed multi-tenant app retrieval works correctly * Fix Interactive_AADAsync test AADSTS7000218 error by using pure public client multi-tenant app - Changed Interactive_AADAsync test to use MSAL-APP-AzureADMultipleOrgsPC-JSON instead of MSAL-APP-AzureADMultipleOrgs-JSON - The original multi-tenant app has both password and certificate credentials configured, which requires client secrets even with isFallbackPublicClient=true - The new app (MSAL-APP-AzureADMultipleOrgsPC-JSON) is a pure public client without credentials, avoiding the AADSTS7000218 error - Only modified the specific failing test, leaving other tests unchanged * Fix Interactive_AADAsync test by using fixed redirect URI - Replace dynamic port selection with fixed http://localhost:52073 - Port 52073 is already configured in pure public client app registration - Eliminates random redirect URI mismatch failures in pipeline - Test logic remains unchanged, only fixes configuration issue * Fix InteractiveConsentPromptAsync and ValidateCcsHeadersForInteractiveAuthCodeFlowAsync tests - Updated both tests to use MergeKVLabDataAsync with pure public client app (MSAL-APP-AzureADMultipleOrgsPC-JSON) - Replaced dynamic port selection with fixed redirect URI (localhost:52073) - Eliminates AADSTS7000218 errors from using app with credentials in public client flows - Consistent with successful Interactive_AADAsync fix pattern * Fix WAM broker tests to use pure public client app - Updated WamUsernamePasswordWithForceRefreshAsync, WamUsernamePasswordPopTokenEnforcedWithCaOnValidResourceAsync, and WamUsernamePasswordPopTokenEnforcedWithCaOnInValidResourceAsync to use MergeKVLabDataAsync with MSAL-APP-AzureADMultipleOrgsPC-JSON instead of MSAL-App-Default-JSON - This eliminates AADSTS7000218 'client_assertion or client_secret required' errors by using a pure public client app without credentials - Added WAM-specific redirect URIs to pure public client app (ae585197-25c5-423b-be00-49175b144fd7) - Consistent with earlier Selenium test fixes using same pure public client pattern * Fix integration tests to use pure public client app - Updated Selenium interactive tests (Interactive_AADAsync, InteractiveConsentPromptAsync, ValidateCcsHeadersForInteractiveAuthCodeFlowAsync) to use MergeKVLabDataAsync with MSAL-APP-AzureADMultipleOrgsPC-JSON - Fixed WAM broker tests to use same pure public client app pattern - Eliminates AADSTS7000218 'client_assertion or client_secret required' errors - Enabled SharePoint Online service principal in tenant to fix SharePoint-related test failures - All tests now use consistent pure public client app configuration without credentials * Fix POP token test credentials for lab migration - Updated WamUsernamePasswordPopTokenEnforcedWithCaOnValidResourceAsync to use MSAL-User-POP-JSON - Updated WamUsernamePasswordPopTokenEnforcedWithCaOnInValidResourceAsync to use MSAL-User-POP-JSON - Both tests now use matching credentials ([email protected]) for proper authentication - Resolves credential mismatch that was causing test failures during migration from msidlab4 to id4slab1 tenant * Fix POP token CA policy tests for lab migration Resolves RuntimeBrokerTests failures during msidlab4 -> id4slab1 migration: 1. Fixed Key Vault secret references: - Corrected typo: ID4SLab1 -> ID4SLAB1 - Updated JSON structure to use nested format with 'user' wrapper 2. Fixed Conditional Access policy targeting mismatch: - CA policy in id4slab1 targets Office 365 Exchange Online (00000002-0000-0ff1-ce00-000000000000) - Changed test scope from 'user.read' (Microsoft Graph) to 'https://outlook.office365.com/Mail.Read' (Exchange Online) - Updated test comments to reflect Exchange Online instead of SharePoint Online The WamUsernamePasswordPopTokenEnforcedWithCaOnInValidResourceAsync test now correctly throws MsalUiRequiredException when requesting POP tokens for resources covered by the CA policy, validating proper token protection enforcement. Both POP token CA policy tests now pass successfully in the new lab environment. * Remove TODO comment from ConfidentialAppSettings * Add friendly name comments to GUIDs per PR feedback - Added app name 'MSAL-APP-AzureADMultipleOrgs' and 'ID4SLAB1 tenant' comments to migrated GUIDs - Added 'MSIDLAB4 tenant (legacy)' comments to legacy GUIDs for clarity - Addresses Gladwin's PR feedback to document GUID purposes for better code readability Files updated: - TestConstants.cs: Added comments to ClientCredentialAudience and PublicCloudConfidentialClientID - ConfidentialAppSettings.cs: Added comments to both new ID4SLAB1 and legacy MSIDLAB4 GUIDs - FmiIntegrationTests.cs: Updated legacy tenant ID comment
1 parent 7acc1fa commit 18ff324

34 files changed

+420
-267
lines changed

tests/CacheCompat/CommonCache.Test.Unit/CacheExecutionTests.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@ public class CacheExecutionTests
1919

2020
private static async Task<LabUserData> GetPublicAadUserDataAsync()
2121
{
22-
var api = new LabServiceApi();
23-
LabResponse labResponse = (await api.GetLabResponseFromApiAsync(UserQuery.PublicAadUserQuery).ConfigureAwait(false));
22+
var labUser = await LabUserHelper.GetDefaultUserAsync().ConfigureAwait(false);
2423
return new LabUserData(
25-
labResponse.User.Upn,
26-
labResponse.User.GetOrFetchPassword(),
27-
labResponse.User.AppId,
28-
labResponse.User.TenantId);
24+
labUser.User.Upn,
25+
labUser.User.GetOrFetchPassword(),
26+
labUser.App.AppId,
27+
labUser.User.TenantId);
2928
}
3029

3130
[AssemblyInitialize]

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ public static HashSet<string> s_scope
3232
public const string MsiResource = "scope";
3333
public static readonly string[] s_graphScopes = new[] { "user.read" };
3434
public const uint JwtToAadLifetimeInSeconds = 60 * 10; // Ten minutes
35-
public const string ClientCredentialAudience = "https://login.microsoftonline.com/f645ad92-e38d-4d1a-b510-d1b09a74a8ca/v2.0";
36-
public const string PublicCloudConfidentialClientID = "88f91eac-c606-4c67-a0e2-a5e8a186854f";
35+
public const string ClientCredentialAudience = "https://login.microsoftonline.com/10c419d4-4a50-45b2-aa4e-919fb84df24f/v2.0"; // ID4SLAB1 tenant
36+
public const string PublicCloudConfidentialClientID = "54a2d933-8bf8-483b-a8f8-0a31924f3c1f"; // MSAL-APP-AzureADMultipleOrgs in ID4SLAB1 tenant
3737
public const string AutomationTestCertName = "LabAuth.MSIDLab.com";
3838
public static Dictionary<string, string> AdditionalAssertionClaims =>
3939
new Dictionary<string, string>() { { "Key1", "Val1" }, { "Key2", "Val2" }, { "customClaims", "{\"xms_az_claim\": [\"GUID\", \"GUID2\", \"GUID3\"]}" } };
@@ -74,6 +74,9 @@ public static HashSet<string> s_scope
7474

7575
public const string ProductionPrefNetworkEnvironment = "login.microsoftonline.com";
7676
public const string ProductionPrefCacheEnvironment = "login.windows.net";
77+
// TODO: Tenant Migration - Regional endpoint may need update after migration
78+
// Current: centralus (old tenant), New: eastus2 (id4slab1 tenant)
79+
// Note: Regional endpoints may not work with new tenant due to AADSTS100007 restrictions
7780
public const string ProductionPrefRegionalEnvironment = "centralus.login.microsoft.com";
7881
public const string ProductionPrefInvalidRegionEnvironment = "invalidregion.login.microsoft.com";
7982
public const string ProductionNotPrefEnvironmentAlias = "sts.windows.net";
@@ -204,7 +207,7 @@ public static HashSet<string> s_scope
204207
public const string PKeyAuthResponse = "PKeyAuth Context=\"context\",Version=\"1.0\"";
205208

206209
public const string RegionName = "REGION_NAME";
207-
public const string Region = "centralus";
210+
public const string Region = "centralus"; // TODO: Tenant Migration - Update for new tenant (id4slab1) is in eastus2
208211
public const string InvalidRegion = "invalidregion";
209212
public const int TimeoutInMs = 2000;
210213
public const string ImdsHost = "169.254.169.254";
@@ -262,6 +265,7 @@ public static IDictionary<string, string> ExtraQueryParameters
262265
public const string MsalCCAKeyVaultUri = "https://id4skeyvault.vault.azure.net/secrets/AzureADIdentityDivisionTestAgentSecret/";
263266

264267
public const string MsalCCAKeyVaultSecretName = "MSIDLAB4-IDLABS-APP-AzureADMyOrg-CC";
268+
// TODO: Tenant Migration - New secret name for id4slab1 tenant: "MSAL-APP-AzureADMultipleOrgs"
265269
public const string MsalOBOKeyVaultUri = "https://id4skeyvault.vault.azure.net/secrets/IdentityDivisionDotNetOBOServiceSecret/";
266270
public const string MsalOBOKeyVaultSecretName = "IdentityDivisionDotNetOBOServiceSecret";
267271
public const string MsalArlingtonOBOKeyVaultUri = "https://msidlabs.vault.azure.net:443/secrets/ARLMSIDLAB1-IDLASBS-App-CC-Secret";
@@ -595,6 +599,14 @@ public static MsalTokenResponse CreateAadTestTokenResponseWithFoci()
595599
return msalTokenResponse;
596600
}
597601

602+
public static MsalTokenResponse CreateAadTestTokenResponseWithMsalUserDefault()
603+
{
604+
// Token response with MSAL User Default user information for ID4SLAB1 tenant
605+
const string jsonResponse = "{\"token_type\":\"Bearer\",\"scope\":\"Calendars.Read openid profile Tasks.Read User.Read email\",\"expires_in\":3600,\"ext_expires_in\":262800,\"access_token\":\"<removed_at>\",\"refresh_token\":\"<removed_rt>\",\"id_token\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJiNmM2OWEzNy1kZjk2LTRkYjAtOTA4OC0yYWI5NmUxZDgyMTUiLCJpc3MiOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vZjY0NWFkOTItZTM4ZC00ZDFhLWI1MTAtZDFiMDlhNzRhOGNhL3YyLjAiLCJpYXQiOjE1Mzg1Mzg0MjIsIm5iZiI6MTUzODUzODQyMiwiZXhwIjoxNTM4NTQyMzIyLCJuYW1lIjoiTVNBTCBVc2VyIERlZmF1bHQiLCJvaWQiOiI5ZjQ4ODBkOC04MGJhLTRjNDAtOTdiYy1mN2EyM2M3MDMwODQiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJNU0FMLVVzZXItRGVmYXVsdEBpZDRzbGFiMS5vbm1pY3Jvc29mdC5jb20iLCJzdWIiOiJZNllrQmRITk5MSE5tVEtlbDlLaFJ6OHdyYXN4ZExSRmlQMTRCUlBXcm40IiwidGlkIjoiZjY0NWFkOTItZTM4ZC00ZDFhLWI1MTAtZDFiMDlhNzRhOGNhIiwidXRpIjoiNm5jaVgwMlNNa2k5azczLUYxc1pBQSIsInZlciI6IjIuMCJ9.\",\"client_info\":\"" + AadRawClientInfo + "\"}";
606+
var msalTokenResponse = JsonHelper.DeserializeFromJson<MsalTokenResponse>(jsonResponse);
607+
return msalTokenResponse;
608+
}
609+
598610
// Fake strings approximately representing tokens of real-world size
599611
internal const string AppAccessToken = "a9sVdA2UrU0KbsG19MjSZp4hlrd4B3mhZc1gfWsu1v3Nxuf9y7MMqdmCqyt4OwJ7cZEFAhdy8wf9vRastaS0Dcc6MnAtaI73k9co06QtQgecLPVMR23ht6cWB25Ta7yqdcQ8X7ARdUD4MWY6o01TqADKE4Vo3DMpzZiwpiS6Z81I5bW9jbWiUTT7J44lRM1qR3ZJUdaa6OSOaLZT4temLYy3bXZh6Bvu7fxOF1pStzwESRDiFegYq6LFf1sHVY5scdvNOifQnWuRy4bWw0Fl17IO5lKzhuEUvaOcgyWea0Hg3Rh9U0or2WPogJna7HraHdp0BWtuj3KOdXqmjxDoFKkTfBXiubpnAqlWwfAKHvKYefNuSRT7ewHLFQNpVVbr93P1Na4aMHqL4DWIQ1BEYoRskQkxNDtzeipb5CP5FrfStz8lFB4nCaZsJPqIzi82BpZ4HwXls8VYrRLt2dK0D9ksxufhN2uUknO2w5MBDvpwl5IuPZiCvwxU0IG3eDyqRCqw1uh18KL4qbeAwp0BPQL7Xexc4eCXC5o24uxipyWK6C169R645sYCgHY9Phiik9fUaTcZ6rzPhSKXK5svhtuMUpDHoHnSkOocCmJPRdNEpULup7zAMtGxGtD4ldfRRtAD5MLBcnKB4QN4KsbysV9lj1xDSFawL22pno61hreo5lJmqlRdj3yRVupqg5IRhilWI0wbUSfUPISrBS0EcCb6rSBd6MPIbstJYOsuJ4Bh4wtLDDeD5oxlMIaF2tkf2QHfspXocd0fLbpA7X9AR1s5yYRRJKgh7SJMgS4JJxLHvF9VZJCKKwnYzlR5EaHYsvDCGyvEi9UkWDCBYMcG6OvzYemjVOTiJTbNM2q6DaqLS9bOMZdZzNfG3PlMAqeZlH5CLv8edLzfDaVZmMCdsc6iUTCAgW4ERDzu7Pf2AeQHQlpplPkgYMxiKZ31BxoaHvwlGReopWq3NN8oOS9QG5VCG1osQRmBZAQHDZTA2x30C4l8L4yH8tvs12trqAvRGnFIq79qluVwJHAPGbQZiAEArzpN7laNqDmzJFCA4emv6DdnCnGdLCSaIubVTBJ5dXbBN9xmphJUGw1jCoFDcFxrcOK0MdJnVGnbkEuSrnEVHUGmocUG1tb0QRZ9Jhn9mGO6RxVcZVzs7XJi8vEQ0FeWJOG0uqsNyi0gCmsglyH8QqsOVlYve8UuxqCgzm1CgfCeNDJEB01xk6iTsjRM0iGcCaZGCm9dRdW99Hlq8SsLRZl2IT48KYj4B9ZP4jBrkY9Ef3xpFRu8fiwgBdzrZosZA2aQPRXlvdM1XjeGaK7iUsrpsVOrvDorBoMucV3uypI85c7yQaTu1qrKfri7OZgEVVBdQO08iipyvyRVSBz1U9ZAc0xqgERqPUoPIOFtqMRx1qJD7WWRUa0hnd66SAgiM2ViGBZspIsUvA9KnAF28uU0kVRn3FXb3B3pNLhpHQSqElPz1uFKp6gO1kqRR6B6TwKn";
600612
internal const string UserAccessToken = "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";

tests/Microsoft.Identity.Test.Integration.netcore/HeadlessTests/ClientCredentialsMtlsPopTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public async Task Sni_Gets_Pop_Token_Successfully_TestAsync()
3333
IConfidentialAppSettings settings = ConfidentialAppSettings.GetSettings(Cloud.Public);
3434

3535
// Retrieve the certificate from settings
36-
X509Certificate2 cert = settings.GetCertificate();
36+
X509Certificate2 cert = settings.Certificate;
3737

3838
// Build Confidential Client Application with SNI certificate at App level
3939
IConfidentialClientApplication confidentialApp = ConfidentialClientApplicationBuilder.Create(MsiAllowListedAppIdforSNI)

tests/Microsoft.Identity.Test.Integration.netcore/HeadlessTests/ClientCredentialsTests.NetFwk.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ public async Task WithOnBeforeTokenRequest_TestAsync(Cloud cloud, TargetFramewor
198198
.AcquireTokenForClient(settings.AppScopes)
199199
.OnBeforeTokenRequest((data) =>
200200
{
201-
ModifyRequest(data, settings.GetCertificate()); // Adding a certificate via handler instead of using WithCertificate
201+
ModifyRequest(data, settings.Certificate); // Adding a certificate via handler instead of using WithCertificate
202202
return Task.CompletedTask;
203203
})
204204
.ExecuteAsync(CancellationToken.None)
@@ -360,10 +360,10 @@ private static IConfidentialClientApplication CreateApp(
360360
switch (credentialType)
361361
{
362362
case CredentialType.Cert:
363-
builder.WithCertificate(settings.GetCertificate());
363+
builder.WithCertificate(settings.Certificate);
364364
break;
365365
case CredentialType.Secret:
366-
builder.WithClientSecret(settings.GetSecret());
366+
builder.WithClientSecret(settings.Secret);
367367
break;
368368
case CredentialType.ClientAssertion_Manual:
369369

@@ -374,7 +374,7 @@ private static IConfidentialClientApplication CreateApp(
374374
builder.WithClientAssertion(() => GetSignedClientAssertionManual(
375375
settings.ClientId,
376376
aud, // for AAD use v2.0, but not for ADFS
377-
settings.GetCertificate(),
377+
settings.Certificate,
378378
useSha2AndPssForAssertion));
379379
break;
380380

@@ -387,14 +387,14 @@ private static IConfidentialClientApplication CreateApp(
387387
() => GetSignedClientAssertionUsingWilson(
388388
settings.ClientId,
389389
aud2,
390-
settings.GetCertificate()));
390+
settings.Certificate));
391391
break;
392392

393393
case CredentialType.ClientClaims_ExtraClaims:
394-
builder.WithClientClaims(settings.GetCertificate(), GetClaims(true), mergeWithDefaultClaims: false, sendX5C: sendX5C);
394+
builder.WithClientClaims(settings.Certificate, GetClaims(true), mergeWithDefaultClaims: false, sendX5C: sendX5C);
395395
break;
396396
case CredentialType.ClientClaims_MergeClaims:
397-
builder.WithClientClaims(settings.GetCertificate(), GetClaims(false), mergeWithDefaultClaims: true, sendX5C: sendX5C);
397+
builder.WithClientClaims(settings.Certificate, GetClaims(false), mergeWithDefaultClaims: true, sendX5C: sendX5C);
398398
break;
399399
default:
400400
throw new NotImplementedException();

tests/Microsoft.Identity.Test.Integration.netcore/HeadlessTests/ClientCredentialsTests.WithRegion.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ namespace Microsoft.Identity.Test.Integration.HeadlessTests
2929
[TestClass]
3030
public class RegionalAuthIntegrationTests
3131
{
32+
// TODO: TENANT MIGRATION - These tests currently use original tenant configuration
33+
// Regional endpoints (eastus2.login.microsoft.com) return AADSTS100007 with new tenant
34+
// "Only managed identities and Microsoft internal service identities are supported"
35+
// Regional endpoints are restricted by Azure AD policy for regular app registrations
36+
3237
private KeyVaultSecretsProvider _keyVault;
3338

3439
private const string RegionalHost = "centralus.login.microsoft.com";
@@ -59,7 +64,7 @@ public async Task AcquireTokenToRegionalEndpointAsync(bool instanceDiscoveryEnab
5964
{
6065
// Arrange
6166
var factory = new HttpSnifferClientFactory();
62-
var settings = ConfidentialAppSettings.GetSettings(Cloud.Public);
67+
var settings = ConfidentialAppSettings.GetSettings(Cloud.PublicLegacy); // Use legacy config for regional tests
6368
settings.InstanceDiscoveryEndpoint = instanceDiscoveryEnabled;
6469
_confidentialClientApplication = BuildCCA(settings, factory);
6570

@@ -78,7 +83,7 @@ public async Task InvalidRegion_GoesToInvalidAuthority_Async()
7883
{
7984
// Arrange
8085
var factory = new HttpSnifferClientFactory();
81-
var settings = ConfidentialAppSettings.GetSettings(Cloud.Public);
86+
var settings = ConfidentialAppSettings.GetSettings(Cloud.PublicLegacy); // Use legacy config for regional tests
8287
_confidentialClientApplication = BuildCCA(settings, factory, true, "invalid");
8388

8489
Environment.SetEnvironmentVariable(TestConstants.RegionName, TestConstants.Region);
@@ -131,7 +136,7 @@ private IConfidentialClientApplication BuildCCA(
131136
}
132137
else
133138
{
134-
builder.WithCertificate(settings.GetCertificate());
139+
builder.WithCertificate(settings.Certificate);
135140
}
136141

137142
builder.WithAuthority($@"https://{settings.Environment}/{settings.TenantId}")
@@ -193,7 +198,7 @@ private static string GetSignedClientAssertionUsingMsalInternal(string clientId,
193198
var manager = PlatformProxyFactory.CreatePlatformProxy(null).CryptographyManager;
194199

195200
var jwtToken = new JsonWebToken(manager, clientId, TestConstants.ClientCredentialAudience, claims);
196-
var cert = ConfidentialAppSettings.GetSettings(Cloud.Public).GetCertificate();
201+
var cert = ConfidentialAppSettings.GetSettings(Cloud.PublicLegacy).Certificate; // Use legacy config for regional tests
197202

198203
return jwtToken.Sign(cert, true, true);
199204
}

tests/Microsoft.Identity.Test.Integration.netcore/HeadlessTests/FmiIntegrationTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class FmiIntegrationTests
2929
private const string Testslice = "dc=ESTSR-PUB-WUS-LZ1-TEST"; //Updated slice for regional tests
3030
private Dictionary<string, (string, bool)> TestsliceQueryParam = new Dictionary<string, (string value, bool includeInCacheKey)> { { "dc", ("ESTSR-PUB-WUS-LZ1-TEST", false) } };
3131
private const string AzureRegion = "westus3";
32-
private const string TenantId = "f645ad92-e38d-4d1a-b510-d1b09a74a8ca"; //Tenant Id for the test app
32+
private const string TenantId = "f645ad92-e38d-4d1a-b510-d1b09a74a8ca"; // MSIDLAB4 tenant (legacy)
3333

3434
[TestMethod]
3535
//RMA getting FMI cred for a leaf entity or sub-RMA

tests/Microsoft.Identity.Test.Integration.netcore/HeadlessTests/InstanceDiscoveryIntegrationTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public async Task AuthorityMigrationAsync()
6969
[TestMethod]
7070
public async Task FailedAuthorityValidationTestAsync()
7171
{
72-
LabResponse labResponse = await LabUserHelper.GetDefaultUserAsync().ConfigureAwait(false);
72+
LabResponse labResponse = await LabUserHelper.GetDefaultUserWithMultiTenantAppAsync().ConfigureAwait(false);
7373
LabUser user = labResponse.User;
7474

7575
IPublicClientApplication pca = PublicClientApplicationBuilder
@@ -97,7 +97,7 @@ public async Task FailedAuthorityValidationTestAsync()
9797
[TestMethod]
9898
public async Task AuthorityValidationTestWithFalseValidateAuthorityAsync()
9999
{
100-
LabResponse labResponse = await LabUserHelper.GetDefaultUserAsync().ConfigureAwait(false);
100+
LabResponse labResponse = await LabUserHelper.GetDefaultUserWithMultiTenantAppAsync().ConfigureAwait(false);
101101
LabUser user = labResponse.User;
102102

103103
IPublicClientApplication pca = PublicClientApplicationBuilder

tests/Microsoft.Identity.Test.Integration.netcore/HeadlessTests/LegacyPopTest.NetFwk.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ public struct JwtClaimTypes
343343
public async Task LegacyPoPAsync()
344344
{
345345
IConfidentialAppSettings settings = ConfidentialAppSettings.GetSettings(Cloud.Public);
346-
X509Certificate2 clientCredsCert = settings.GetCertificate();
346+
X509Certificate2 clientCredsCert = settings.Certificate;
347347
RsaSecurityKey popKey = CreateRsaSecurityKey();
348348

349349
var cca = ConfidentialClientApplicationBuilder
@@ -398,7 +398,7 @@ public async Task LegacyPoPAsync()
398398
public async Task LegacyPopUsingNewProtocol_CertThumbprinJWK_Async()
399399
{
400400
IConfidentialAppSettings settings = ConfidentialAppSettings.GetSettings(Cloud.Public);
401-
X509Certificate2 clientCredsCert = settings.GetCertificate();
401+
X509Certificate2 clientCredsCert = settings.Certificate;
402402

403403
var cca = ConfidentialClientApplicationBuilder
404404
.Create(settings.ClientId)
@@ -442,7 +442,7 @@ public async Task LegacyPopUsingNewProtocol_CertThumbprinJWK_Async()
442442
public async Task LegacyPopUsingNewProtocol_RsaKey_Async()
443443
{
444444
IConfidentialAppSettings settings = ConfidentialAppSettings.GetSettings(Cloud.Public);
445-
X509Certificate2 clientCredsCert = settings.GetCertificate();
445+
X509Certificate2 clientCredsCert = settings.Certificate;
446446

447447
var cca = ConfidentialClientApplicationBuilder
448448
.Create(settings.ClientId)

0 commit comments

Comments
 (0)