|
11 | 11 | using System.Web; |
12 | 12 | using Azure.Core; |
13 | 13 | using Azure.Core.Diagnostics; |
| 14 | +using Azure.Core.Pipeline; |
14 | 15 | using Azure.Core.TestFramework; |
15 | 16 | using Azure.Identity.Tests.Mock; |
16 | 17 | using Microsoft.AspNetCore.Http; |
@@ -100,6 +101,73 @@ public async Task VerifyImdsRequestWithClientIdMockAsync() |
100 | 101 | Assert.AreEqual("true", metadataValue); |
101 | 102 | } |
102 | 103 |
|
| 104 | + [NonParallelizable] |
| 105 | + [Test] |
| 106 | + [TestCase(null)] |
| 107 | + [TestCase("Auto-Detect")] |
| 108 | + [TestCase("eastus")] |
| 109 | + [TestCase("westus")] |
| 110 | + public async Task VerifyImdsRequestWithClientIdAndRegionalAuthorityNameMockAsync(string regionName) |
| 111 | + { |
| 112 | + using var environment = new TestEnvVar(new() { {"AZURE_REGIONAL_AUTHORITY_NAME", regionName}, {"MSI_ENDPOINT", null }, { "MSI_SECRET", null }, { "IDENTITY_ENDPOINT", null }, { "IDENTITY_HEADER", null }, { "AZURE_POD_IDENTITY_AUTHORITY_HOST", null } }); |
| 113 | + |
| 114 | + var response = CreateMockResponse(200, ExpectedToken); |
| 115 | + var mockTransport = new MockTransport(response); |
| 116 | + var options = new TokenCredentialOptions() { Transport = mockTransport }; |
| 117 | + var pipeline = CredentialPipeline.GetInstance(options); |
| 118 | + |
| 119 | + ManagedIdentityCredential credential = InstrumentClient(new ManagedIdentityCredential("mock-client-id", pipeline)); |
| 120 | + |
| 121 | + AccessToken actualToken = await credential.GetTokenAsync(new TokenRequestContext(MockScopes.Default)); |
| 122 | + |
| 123 | + Assert.AreEqual(ExpectedToken, actualToken.Token); |
| 124 | + |
| 125 | + MockRequest request = mockTransport.Requests[0]; |
| 126 | + |
| 127 | + string query = request.Uri.Query; |
| 128 | + |
| 129 | + Assert.AreEqual(request.Uri.Host, "169.254.169.254"); |
| 130 | + Assert.AreEqual(request.Uri.Path, "/metadata/identity/oauth2/token"); |
| 131 | + Assert.IsTrue(query.Contains("api-version=2018-02-01")); |
| 132 | + Assert.IsTrue(query.Contains($"resource={Uri.EscapeDataString(ScopeUtilities.ScopesToResource(MockScopes.Default))}")); |
| 133 | + Assert.IsTrue(request.Headers.TryGetValue("Metadata", out string metadataValue)); |
| 134 | + Assert.IsTrue(query.Contains($"{Constants.ManagedIdentityClientId}=mock-client-id")); |
| 135 | + Assert.AreEqual("true", metadataValue); |
| 136 | + } |
| 137 | + |
| 138 | + [NonParallelizable] |
| 139 | + [Test] |
| 140 | + [TestCaseSource(nameof(AuthorityHostValues))] |
| 141 | + public async Task VerifyImdsRequestWithClientIdAndNonPubCloudMockAsync(Uri authority) |
| 142 | + { |
| 143 | + using var environment = new TestEnvVar(new() { { "MSI_ENDPOINT", null }, { "MSI_SECRET", null }, { "IDENTITY_ENDPOINT", null }, { "IDENTITY_HEADER", null }, { "AZURE_POD_IDENTITY_AUTHORITY_HOST", null } }); |
| 144 | + |
| 145 | + var response = CreateMockResponse(200, ExpectedToken); |
| 146 | + var mockTransport = new MockTransport(response); |
| 147 | + var options = new TokenCredentialOptions() { Transport = mockTransport, AuthorityHost = authority }; |
| 148 | + //var pipeline = CredentialPipeline.GetInstance(options); |
| 149 | + var _pipeline = new HttpPipeline(mockTransport); |
| 150 | + var pipeline = new CredentialPipeline(authority, _pipeline, new ClientDiagnostics(options)); |
| 151 | + |
| 152 | + ManagedIdentityCredential credential = InstrumentClient(new ManagedIdentityCredential(new ManagedIdentityClient( pipeline, "mock-client-id"))); |
| 153 | + |
| 154 | + AccessToken actualToken = await credential.GetTokenAsync(new TokenRequestContext(MockScopes.Default)); |
| 155 | + |
| 156 | + Assert.AreEqual(ExpectedToken, actualToken.Token); |
| 157 | + |
| 158 | + MockRequest request = mockTransport.Requests[0]; |
| 159 | + |
| 160 | + string query = request.Uri.Query; |
| 161 | + |
| 162 | + Assert.AreEqual(request.Uri.Host, "169.254.169.254"); |
| 163 | + Assert.AreEqual(request.Uri.Path, "/metadata/identity/oauth2/token"); |
| 164 | + Assert.IsTrue(query.Contains("api-version=2018-02-01")); |
| 165 | + Assert.IsTrue(query.Contains($"resource={Uri.EscapeDataString(ScopeUtilities.ScopesToResource(MockScopes.Default))}")); |
| 166 | + Assert.IsTrue(request.Headers.TryGetValue("Metadata", out string metadataValue)); |
| 167 | + Assert.IsTrue(query.Contains($"{Constants.ManagedIdentityClientId}=mock-client-id")); |
| 168 | + Assert.AreEqual("true", metadataValue); |
| 169 | + } |
| 170 | + |
103 | 171 | [NonParallelizable] |
104 | 172 | [Test] |
105 | 173 | public async Task VerifyImdsRequestWithResourceIdMockAsync() |
@@ -781,6 +849,17 @@ private static IEnumerable<TestCaseData> ExceptionalEnvironmentConfigs() |
781 | 849 | yield return new TestCaseData(new Dictionary<string, string>() { { "MSI_ENDPOINT", null }, { "MSI_SECRET", null }, { "IDENTITY_ENDPOINT", null }, { "IDENTITY_HEADER", null }, { "IDENTITY_SERVER_THUMBPRINT", "null" }, { "AZURE_POD_IDENTITY_AUTHORITY_HOST", "http::@/bogusuri" } }); |
782 | 850 | } |
783 | 851 |
|
| 852 | + public static IEnumerable<object[]> AuthorityHostValues() |
| 853 | + { |
| 854 | + // params |
| 855 | + // az thrown Exception message, expected message, expected exception |
| 856 | + yield return new object[] { AzureAuthorityHosts.AzureChina }; |
| 857 | + yield return new object[] { AzureAuthorityHosts.AzureGermany }; |
| 858 | + yield return new object[] { AzureAuthorityHosts.AzureGovernment }; |
| 859 | + yield return new object[] { AzureAuthorityHosts.AzurePublicCloud }; |
| 860 | + yield return new object[] { new Uri("https://foo.bar") }; |
| 861 | + } |
| 862 | + |
784 | 863 | private MockResponse CreateMockResponse(int responseCode, string token) |
785 | 864 | { |
786 | 865 | var response = new MockResponse(responseCode); |
|
0 commit comments