Skip to content

Commit b78cb47

Browse files
authored
Merge pull request #9378 from cormacpayne/token-fix
Fix bug with incorrect URL being used in some cases for Functions calls
2 parents a5f529e + 27a0755 commit b78cb47

File tree

4 files changed

+116
-1
lines changed

4 files changed

+116
-1
lines changed

src/Accounts/Accounts/ChangeLog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
- Additional information about change #1
1919
-->
2020
## Upcoming Release
21+
* Fix bug with incorrect URL being used in some cases for Functions calls
22+
- More information here: https://github.com/Azure/azure-powershell/issues/8983
2123

2224
## Version 1.5.2
2325
* Update Authentication Library to fix ADFS issues with username/password auth

src/Accounts/Authentication.Test/AuthenticationFactoryTests.cs

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,5 +399,100 @@ public void AppServiceManagedIdentity()
399399
Assert.Equal(expectedAccessToken, accessToken);
400400
Assert.Equal(expectedExpiresOn, msat.ExpiresOn);
401401
}
402+
403+
[Fact]
404+
[Trait(Category.AcceptanceType, Category.CheckIn)]
405+
public void AppServiceManagedIdentityWithDataPlane()
406+
{
407+
AzureSessionInitializer.InitializeAzureSession();
408+
var tenant = Guid.NewGuid().ToString();
409+
var userId = Guid.NewGuid().ToString();
410+
var environment = AzureEnvironment.PublicEnvironments["AzureCloud"];
411+
var account = new AzureAccount
412+
{
413+
Id = userId,
414+
Type = AzureAccount.AccountType.ManagedService
415+
};
416+
const string resource = @"https://vault.azure.com/";
417+
const string endpoint = @"http://127.0.0.1:41217/MSI/token/";
418+
var expectedUri = $"{endpoint}?resource={resource}&api-version=2017-09-01";
419+
account.SetProperty(AzureAccount.Property.MSILoginUri, endpoint);
420+
account.SetProperty(AzureAccount.Property.MSILoginSecret, @"bar");
421+
const string expectedAccessToken = "foo";
422+
var expectedExpiresOn = DateTimeOffset.Parse("1/23/2019 7:15:42 AM +00:00");
423+
var responses = new Dictionary<string, ManagedServiceAppServiceTokenInfo>(StringComparer.OrdinalIgnoreCase)
424+
{
425+
{
426+
expectedUri,
427+
new ManagedServiceAppServiceTokenInfo()
428+
{
429+
AccessToken = expectedAccessToken,
430+
ExpiresOn = expectedExpiresOn,
431+
Resource = resource,
432+
TokenType = "Bearer",
433+
}
434+
}
435+
};
436+
AzureSession.Instance.RegisterComponent(HttpClientOperationsFactory.Name, () => TestHttpOperationsFactory.Create(responses, _output), true);
437+
var msat = new ManagedServiceAppServiceAccessToken(account, environment, environment.GetEndpoint(resource) ?? resource, tenant);
438+
Assert.Equal(expectedUri, msat.RequestUris.Peek());
439+
var accessToken = msat.AccessToken;
440+
Assert.Equal(expectedAccessToken, accessToken);
441+
Assert.Equal(expectedExpiresOn, msat.ExpiresOn);
442+
}
443+
444+
[Fact]
445+
[Trait(Category.AcceptanceType, Category.CheckIn)]
446+
public void AppServiceManagedIdentityWithServiceManagement()
447+
{
448+
AzureSessionInitializer.InitializeAzureSession();
449+
var tenant = Guid.NewGuid().ToString();
450+
var userId = Guid.NewGuid().ToString();
451+
var environment = AzureEnvironment.PublicEnvironments["AzureCloud"];
452+
var account = new AzureAccount
453+
{
454+
Id = userId,
455+
Type = AzureAccount.AccountType.ManagedService
456+
};
457+
const string resource = @"https://management.azure.com/";
458+
const string serviceManagementResource = @"https://management.core.windows.net/";
459+
const string endpoint = @"http://127.0.0.1:41217/MSI/token/";
460+
var expectedUri = $"{endpoint}?resource={resource}&api-version=2017-09-01";
461+
account.SetProperty(AzureAccount.Property.MSILoginUri, endpoint);
462+
account.SetProperty(AzureAccount.Property.MSILoginSecret, @"bar");
463+
const string expectedAccessToken = "foo";
464+
var expectedExpiresOn = DateTimeOffset.Parse("1/23/2019 7:15:42 AM +00:00");
465+
var responses = new Dictionary<string, ManagedServiceAppServiceTokenInfo>(StringComparer.OrdinalIgnoreCase)
466+
{
467+
{
468+
expectedUri,
469+
new ManagedServiceAppServiceTokenInfo()
470+
{
471+
AccessToken = expectedAccessToken,
472+
ExpiresOn = expectedExpiresOn,
473+
Resource = resource,
474+
TokenType = "Bearer",
475+
}
476+
}
477+
};
478+
AzureSession.Instance.RegisterComponent(HttpClientOperationsFactory.Name, () => TestHttpOperationsFactory.Create(responses, _output), true);
479+
var msat = new ManagedServiceAppServiceAccessToken(account, environment, GetFunctionsResourceId(serviceManagementResource, environment), tenant);
480+
Assert.Equal(expectedUri, msat.RequestUris.Peek());
481+
var accessToken = msat.AccessToken;
482+
Assert.Equal(expectedAccessToken, accessToken);
483+
Assert.Equal(expectedExpiresOn, msat.ExpiresOn);
484+
}
485+
private string GetFunctionsResourceId(string resourceIdOrEndpointName, IAzureEnvironment environment)
486+
{
487+
var resourceId = environment.GetEndpoint(resourceIdOrEndpointName) ?? resourceIdOrEndpointName;
488+
if (string.Equals(
489+
environment.GetEndpoint(AzureEnvironment.Endpoint.ActiveDirectoryServiceEndpointResourceId),
490+
resourceId, StringComparison.OrdinalIgnoreCase))
491+
{
492+
resourceId = environment.GetEndpoint(AzureEnvironment.Endpoint.ResourceManager);
493+
}
494+
495+
return resourceId;
496+
}
402497
}
403498
}

src/Accounts/Authentication/Authentication/ManagedServiceAppServiceAccessToken.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ public ManagedServiceAppServiceAccessToken(IAzureAccount account, IAzureEnvironm
2424
{
2525
}
2626

27+
public ManagedServiceAppServiceAccessToken(IAzureAccount account, IAzureEnvironment environment, string resourceId, string tenant = "Common")
28+
: base(account, environment, resourceId, tenant)
29+
{
30+
}
31+
2732
protected override IEnumerable<string> BuildTokenUri(string baseUri, IAzureAccount account, IdentityType identityType,
2833
string resourceId)
2934
{

src/Accounts/Authentication/Factories/AuthenticationFactory.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ private IAccessToken GetManagedServiceToken(IAzureAccount account, IAzureEnviron
427427

428428
if (account.IsPropertySet(AuthenticationFactory.AppServiceManagedIdentityFlag))
429429
{
430-
return new ManagedServiceAppServiceAccessToken(account, environment, tenant);
430+
return new ManagedServiceAppServiceAccessToken(account, environment, GetFunctionsResourceId(resourceId, environment), tenant);
431431
}
432432

433433
return new ManagedServiceAccessToken(account, environment, GetResourceId(resourceId, environment), tenant);
@@ -438,6 +438,19 @@ private string GetResourceId(string resourceIdorEndpointName, IAzureEnvironment
438438
return environment.GetEndpoint(resourceIdorEndpointName) ?? resourceIdorEndpointName;
439439
}
440440

441+
private string GetFunctionsResourceId(string resourceIdOrEndpointName, IAzureEnvironment environment)
442+
{
443+
var resourceId = environment.GetEndpoint(resourceIdOrEndpointName) ?? resourceIdOrEndpointName;
444+
if (string.Equals(
445+
environment.GetEndpoint(AzureEnvironment.Endpoint.ActiveDirectoryServiceEndpointResourceId),
446+
resourceId, StringComparison.OrdinalIgnoreCase))
447+
{
448+
resourceId = environment.GetEndpoint(AzureEnvironment.Endpoint.ResourceManager);
449+
}
450+
451+
return resourceId;
452+
}
453+
441454
private AdalConfiguration GetAdalConfiguration(IAzureEnvironment environment, string tenantId,
442455
string resourceId, TokenCache tokenCache)
443456
{

0 commit comments

Comments
 (0)