Skip to content

Commit 5298d85

Browse files
committed
Use AppHomeTenantId for acquiring app token when TenantId is not tenant
1 parent 011bd15 commit 5298d85

File tree

11 files changed

+106
-12
lines changed

11 files changed

+106
-12
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
<MicrosoftGraphVersion>4.36.0</MicrosoftGraphVersion>
9292
<MicrosoftGraphBetaVersion>4.57.0-preview</MicrosoftGraphBetaVersion>
9393
<MicrosoftExtensionsHttpVersion>3.1.3</MicrosoftExtensionsHttpVersion>
94-
<MicrosoftIdentityAbstractionsVersion>7.1.0</MicrosoftIdentityAbstractionsVersion>
94+
<MicrosoftIdentityAbstractionsVersion>7.2.0</MicrosoftIdentityAbstractionsVersion>
9595
<NetNineRuntimeVersion>9.0.0-rc.2.24473.5</NetNineRuntimeVersion>
9696
<AspNetCoreNineRuntimeVersion>9.0.0-rc.2.24474.3</AspNetCoreNineRuntimeVersion>
9797
<!--CVE-2024-43485-->

src/Microsoft.Identity.Web.TokenAcquisition/MergedOptions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public ConfidentialClientApplicationOptions ConfidentialClientApplicationOptions
3737

3838
// Properties of ConfidentialClientApplication which are not in MicrosoftIdentityOptions
3939
public AadAuthorityAudience AadAuthorityAudience { get; set; }
40+
public string? AppHomeTenantId { get; set; }
4041
public AzureCloudInstance AzureCloudInstance { get; set; }
4142
public string? AzureRegion { get; set; }
4243
public IEnumerable<string>? ClientCapabilities { get; set; }
@@ -537,6 +538,8 @@ public static void UpdateMergedOptionsFromMicrosoftIdentityApplicationOptions(Mi
537538
mergedOptions.TenantId = microsoftIdentityApplicationOptions.TenantId;
538539
}
539540

541+
mergedOptions.AppHomeTenantId = microsoftIdentityApplicationOptions.AppHomeTenantId;
542+
540543
mergedOptions.WithSpaAuthCode |= microsoftIdentityApplicationOptions.WithSpaAuthCode;
541544

542545
if ((mergedOptions.ClientCredentials == null || !mergedOptions.ClientCredentials.Any()) && microsoftIdentityApplicationOptions.ClientCredentials != null)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
#nullable enable
2+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.get -> string?
3+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.set -> void
24
Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void
35
readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor<Microsoft.Identity.Web.TokenAcquisitionExtensionOptions!>?
6+
static Microsoft.Identity.Web.TokenAcquisition.ResolveTenant(string? tenant, Microsoft.Identity.Web.MergedOptions! mergedOptions) -> string?
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#nullable enable
2+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.get -> string?
3+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.set -> void
24
Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void
35
readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor<Microsoft.Identity.Web.TokenAcquisitionExtensionOptions!>?
4-
6+
static Microsoft.Identity.Web.TokenAcquisition.ResolveTenant(string? tenant, Microsoft.Identity.Web.MergedOptions! mergedOptions) -> string?
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
#nullable enable
2+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.get -> string?
3+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.set -> void
24
Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void
35
readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor<Microsoft.Identity.Web.TokenAcquisitionExtensionOptions!>?
6+
static Microsoft.Identity.Web.TokenAcquisition.ResolveTenant(string? tenant, Microsoft.Identity.Web.MergedOptions! mergedOptions) -> string?
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
#nullable enable
2+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.get -> string?
3+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.set -> void
24
Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void
35
readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor<Microsoft.Identity.Web.TokenAcquisitionExtensionOptions!>?
6+
static Microsoft.Identity.Web.TokenAcquisition.ResolveTenant(string? tenant, Microsoft.Identity.Web.MergedOptions! mergedOptions) -> string?
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
#nullable enable
2+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.get -> string?
3+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.set -> void
24
Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void
35
readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor<Microsoft.Identity.Web.TokenAcquisitionExtensionOptions!>?
6+
static Microsoft.Identity.Web.TokenAcquisition.ResolveTenant(string? tenant, Microsoft.Identity.Web.MergedOptions! mergedOptions) -> string?
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
#nullable enable
2+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.get -> string?
3+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.set -> void
24
Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void
35
readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor<Microsoft.Identity.Web.TokenAcquisitionExtensionOptions!>?
6+
static Microsoft.Identity.Web.TokenAcquisition.ResolveTenant(string? tenant, Microsoft.Identity.Web.MergedOptions! mergedOptions) -> string?
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
#nullable enable
2+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.get -> string?
3+
Microsoft.Identity.Web.MergedOptions.AppHomeTenantId.set -> void
24
Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void
35
readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor<Microsoft.Identity.Web.TokenAcquisitionExtensionOptions!>?
6+
static Microsoft.Identity.Web.TokenAcquisition.ResolveTenant(string? tenant, Microsoft.Identity.Web.MergedOptions! mergedOptions) -> string?

src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class OAuthConstants
7272
/// <summary>
7373
/// Meta-tenant identifiers which are not allowed in client credentials.
7474
/// </summary>
75-
private readonly HashSet<string> _metaTenantIdentifiers = new HashSet<string>(
75+
private static readonly HashSet<string> _metaTenantIdentifiers = new HashSet<string>(
7676
new[]
7777
{
7878
Constants.Common,
@@ -397,6 +397,32 @@ private void LogAuthResult(AuthenticationResult? authenticationResult)
397397
}
398398
}
399399

400+
/// <summary>
401+
/// Resolves the tenant based on if the tenant is already set or the TenantId configured
402+
/// in the options or the AppHomeTenantId if the TenantId is a meta tenant.
403+
/// </summary>
404+
/// <param name="tenant">Provided tenant or null if not provided</param>
405+
/// <param name="mergedOptions">Merged configuration from which to retrieve tenant value as necessary</param>
406+
/// <returns>Resolved tenant</returns>
407+
internal static string? ResolveTenant(string? tenant, MergedOptions mergedOptions)
408+
{
409+
if (string.IsNullOrEmpty(tenant))
410+
{
411+
tenant = mergedOptions.TenantId;
412+
if (!string.IsNullOrEmpty(tenant) && _metaTenantIdentifiers.Contains(tenant!) && !string.IsNullOrEmpty(mergedOptions.AppHomeTenantId))
413+
{
414+
tenant = mergedOptions.AppHomeTenantId;
415+
}
416+
}
417+
418+
if (!string.IsNullOrEmpty(tenant) && _metaTenantIdentifiers.Contains(tenant!))
419+
{
420+
throw new ArgumentException(IDWebErrorMessage.ClientCredentialTenantShouldBeTenanted, nameof(tenant));
421+
}
422+
423+
return tenant;
424+
}
425+
400426
/// <summary>
401427
/// Acquires an authentication result from the authority configured in the app, for the confidential client itself (not on behalf of a user)
402428
/// using either a client credentials or managed identity flow. See https://aka.ms/msal-net-client-credentials for client credentials or
@@ -427,15 +453,7 @@ public async Task<AuthenticationResult> GetAuthenticationResultForAppAsync(
427453

428454
MergedOptions mergedOptions = _tokenAcquisitionHost.GetOptions(authenticationScheme ?? tokenAcquisitionOptions?.AuthenticationOptionsName, out _);
429455

430-
if (string.IsNullOrEmpty(tenant))
431-
{
432-
tenant = mergedOptions.TenantId;
433-
}
434-
435-
if (!string.IsNullOrEmpty(tenant) && _metaTenantIdentifiers.Contains(tenant!))
436-
{
437-
throw new ArgumentException(IDWebErrorMessage.ClientCredentialTenantShouldBeTenanted, nameof(tenant));
438-
}
456+
tenant = ResolveTenant(tenant, mergedOptions);
439457

440458
// If using managed identity
441459
if (tokenAcquisitionOptions != null && tokenAcquisitionOptions.ManagedIdentity != null)

0 commit comments

Comments
 (0)