diff --git a/src/Microsoft.Identity.Web.Certificate/PublicAPI.Unshipped.txt b/src/Microsoft.Identity.Web.Certificate/PublicAPI.Unshipped.txt index e69de29bb..7dc5c5811 100644 --- a/src/Microsoft.Identity.Web.Certificate/PublicAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.Certificate/PublicAPI.Unshipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/DefaultAuthorizationHeaderProvider.cs b/src/Microsoft.Identity.Web.TokenAcquisition/DefaultAuthorizationHeaderProvider.cs index 0b478d829..888b652db 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/DefaultAuthorizationHeaderProvider.cs +++ b/src/Microsoft.Identity.Web.TokenAcquisition/DefaultAuthorizationHeaderProvider.cs @@ -101,7 +101,9 @@ private static TokenAcquisitionOptions CreateTokenAcquisitionOptionsFromApiOptio CancellationToken = cancellationToken, Claims = downstreamApiOptions?.AcquireTokenOptions.Claims, CorrelationId = downstreamApiOptions?.AcquireTokenOptions.CorrelationId ?? Guid.Empty, + ExtraHeadersParameters = downstreamApiOptions?.AcquireTokenOptions.ExtraHeadersParameters, ExtraQueryParameters = downstreamApiOptions?.AcquireTokenOptions.ExtraQueryParameters, + ExtraParameters = downstreamApiOptions?.AcquireTokenOptions.ExtraParameters, ForceRefresh = downstreamApiOptions?.AcquireTokenOptions.ForceRefresh ?? false, LongRunningWebApiSessionKey = downstreamApiOptions?.AcquireTokenOptions.LongRunningWebApiSessionKey, ManagedIdentity = downstreamApiOptions?.AcquireTokenOptions.ManagedIdentity, diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net462/InternalAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net462/InternalAPI.Unshipped.txt index e69de29bb..997694dde 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net462/InternalAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net462/InternalAPI.Unshipped.txt @@ -0,0 +1,6 @@ +#nullable enable +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnAfterTokenAcquisition(Microsoft.Identity.Client.AuthenticationResult! result, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBuildConfidentialClientApplication(Microsoft.Identity.Client.ConfidentialClientApplicationBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor? diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net462/PublicAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net462/PublicAPI.Unshipped.txt index e69de29bb..929635dc2 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net462/PublicAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net462/PublicAPI.Unshipped.txt @@ -0,0 +1,5 @@ +#nullable enable +Microsoft.Identity.Web.BeforeTokenAcquisitionForApp +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.OnBeforeTokenAcquisitionForApp -> Microsoft.Identity.Web.BeforeTokenAcquisitionForApp? +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.TokenAcquisitionExtensionOptions() -> void diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net472/InternalAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net472/InternalAPI.Unshipped.txt index e69de29bb..997694dde 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net472/InternalAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net472/InternalAPI.Unshipped.txt @@ -0,0 +1,6 @@ +#nullable enable +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnAfterTokenAcquisition(Microsoft.Identity.Client.AuthenticationResult! result, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBuildConfidentialClientApplication(Microsoft.Identity.Client.ConfidentialClientApplicationBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor? diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net472/PublicAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net472/PublicAPI.Unshipped.txt index e69de29bb..929635dc2 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net472/PublicAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net472/PublicAPI.Unshipped.txt @@ -0,0 +1,5 @@ +#nullable enable +Microsoft.Identity.Web.BeforeTokenAcquisitionForApp +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.OnBeforeTokenAcquisitionForApp -> Microsoft.Identity.Web.BeforeTokenAcquisitionForApp? +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.TokenAcquisitionExtensionOptions() -> void diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net6.0/InternalAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net6.0/InternalAPI.Unshipped.txt index e69de29bb..997694dde 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net6.0/InternalAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net6.0/InternalAPI.Unshipped.txt @@ -0,0 +1,6 @@ +#nullable enable +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnAfterTokenAcquisition(Microsoft.Identity.Client.AuthenticationResult! result, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBuildConfidentialClientApplication(Microsoft.Identity.Client.ConfidentialClientApplicationBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor? diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net6.0/PublicAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net6.0/PublicAPI.Unshipped.txt index e69de29bb..929635dc2 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net6.0/PublicAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net6.0/PublicAPI.Unshipped.txt @@ -0,0 +1,5 @@ +#nullable enable +Microsoft.Identity.Web.BeforeTokenAcquisitionForApp +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.OnBeforeTokenAcquisitionForApp -> Microsoft.Identity.Web.BeforeTokenAcquisitionForApp? +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.TokenAcquisitionExtensionOptions() -> void diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net7.0/InternalAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net7.0/InternalAPI.Unshipped.txt index e69de29bb..997694dde 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net7.0/InternalAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net7.0/InternalAPI.Unshipped.txt @@ -0,0 +1,6 @@ +#nullable enable +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnAfterTokenAcquisition(Microsoft.Identity.Client.AuthenticationResult! result, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBuildConfidentialClientApplication(Microsoft.Identity.Client.ConfidentialClientApplicationBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor? diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net7.0/PublicAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net7.0/PublicAPI.Unshipped.txt index e69de29bb..929635dc2 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net7.0/PublicAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net7.0/PublicAPI.Unshipped.txt @@ -0,0 +1,5 @@ +#nullable enable +Microsoft.Identity.Web.BeforeTokenAcquisitionForApp +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.OnBeforeTokenAcquisitionForApp -> Microsoft.Identity.Web.BeforeTokenAcquisitionForApp? +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.TokenAcquisitionExtensionOptions() -> void diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net8.0/InternalAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net8.0/InternalAPI.Unshipped.txt index e69de29bb..997694dde 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net8.0/InternalAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net8.0/InternalAPI.Unshipped.txt @@ -0,0 +1,6 @@ +#nullable enable +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnAfterTokenAcquisition(Microsoft.Identity.Client.AuthenticationResult! result, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBuildConfidentialClientApplication(Microsoft.Identity.Client.ConfidentialClientApplicationBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor? diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net8.0/PublicAPI.Unshipped.txt index e69de29bb..929635dc2 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net8.0/PublicAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net8.0/PublicAPI.Unshipped.txt @@ -0,0 +1,5 @@ +#nullable enable +Microsoft.Identity.Web.BeforeTokenAcquisitionForApp +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.OnBeforeTokenAcquisitionForApp -> Microsoft.Identity.Web.BeforeTokenAcquisitionForApp? +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.TokenAcquisitionExtensionOptions() -> void diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net9.0/InternalAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net9.0/InternalAPI.Unshipped.txt index e69de29bb..997694dde 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net9.0/InternalAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net9.0/InternalAPI.Unshipped.txt @@ -0,0 +1,6 @@ +#nullable enable +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnAfterTokenAcquisition(Microsoft.Identity.Client.AuthenticationResult! result, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBuildConfidentialClientApplication(Microsoft.Identity.Client.ConfidentialClientApplicationBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor? diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net9.0/PublicAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net9.0/PublicAPI.Unshipped.txt index e69de29bb..929635dc2 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net9.0/PublicAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/net9.0/PublicAPI.Unshipped.txt @@ -0,0 +1,5 @@ +#nullable enable +Microsoft.Identity.Web.BeforeTokenAcquisitionForApp +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.OnBeforeTokenAcquisitionForApp -> Microsoft.Identity.Web.BeforeTokenAcquisitionForApp? +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.TokenAcquisitionExtensionOptions() -> void diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/netstandard2.0/InternalAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/netstandard2.0/InternalAPI.Unshipped.txt index e69de29bb..985750de1 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/netstandard2.0/InternalAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/netstandard2.0/InternalAPI.Unshipped.txt @@ -0,0 +1,5 @@ +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnAfterTokenAcquisition(Microsoft.Identity.Client.AuthenticationResult! result, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionAddInOptions.InvokeOnBuildConfidentialClientApplication(Microsoft.Identity.Client.ConfidentialClientApplicationBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.InvokeOnBeforeTokenAcquisitionForApp(Microsoft.Identity.Client.AcquireTokenForClientParameterBuilder! builder, Microsoft.Identity.Abstractions.AcquireTokenOptions? acquireTokenOptions) -> void +readonly Microsoft.Identity.Web.TokenAcquisition.tokenAcquisitionExtensionOptionsMonitor -> Microsoft.Extensions.Options.IOptionsMonitor? diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index e69de29bb..30834cec9 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -0,0 +1,4 @@ +Microsoft.Identity.Web.BeforeTokenAcquisitionForApp +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.OnBeforeTokenAcquisitionForApp -> Microsoft.Identity.Web.BeforeTokenAcquisitionForApp? +Microsoft.Identity.Web.TokenAcquisitionExtensionOptions.TokenAcquisitionExtensionOptions() -> void diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquirer.cs b/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquirer.cs index fd2bd5042..614e53efa 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquirer.cs +++ b/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquirer.cs @@ -83,6 +83,7 @@ async Task ITokenAcquirer.GetTokenForAppAsync(string scope, UserFlow = tokenAcquisitionOptions.UserFlow, PopPublicKey = tokenAcquisitionOptions.PopPublicKey, PopClaim = tokenAcquisitionOptions.PopClaim, + ExtraParameters = tokenAcquisitionOptions.ExtraParameters, }; } } diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs b/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs index 4db45fb6e..721772528 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs +++ b/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs @@ -15,6 +15,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Microsoft.Identity.Abstractions; using Microsoft.Identity.Client; using Microsoft.Identity.Client.Advanced; @@ -57,6 +58,7 @@ class OAuthConstants protected readonly ITokenAcquisitionHost _tokenAcquisitionHost; protected readonly ICredentialsLoader _credentialsLoader; protected readonly ICertificatesObserver? _certificatesObserver; + protected readonly IOptionsMonitor? tokenAcquisitionExtensionOptionsMonitor; /// /// Scopes which are already requested by MSAL.NET. They should not be re-requested;. @@ -104,6 +106,7 @@ public TokenAcquisition( _tokenAcquisitionHost = tokenAcquisitionHost; _credentialsLoader = credentialsLoader; _certificatesObserver = serviceProvider.GetService(); + tokenAcquisitionExtensionOptionsMonitor = serviceProvider.GetService>(); } #if NET6_0_OR_GREATER @@ -384,6 +387,9 @@ public async Task GetAuthenticationResultForAppAsync( } } + TokenAcquisitionExtensionOptions? addInOptions = tokenAcquisitionExtensionOptionsMonitor?.CurrentValue; + + // Use MSAL to get the right token to call the API var application = await GetOrBuildConfidentialClientApplicationAsync(mergedOptions); @@ -391,6 +397,11 @@ public async Task GetAuthenticationResultForAppAsync( .AcquireTokenForClient(new[] { scope }.Except(_scopesRequestedByMsal)) .WithSendX5C(mergedOptions.SendX5C); + if (addInOptions!=null) + { + addInOptions.InvokeOnBeforeTokenAcquisitionForApp(builder, tokenAcquisitionOptions); + } + // MSAL.net only allows .WithTenantId for AAD authorities. This makes sense as there should // not be cross tenant operations with such an authority. if (!mergedOptions.Instance.Contains(Constants.CiamAuthoritySuffix @@ -414,6 +425,9 @@ public async Task GetAuthenticationResultForAppAsync( { builder.WithExtraHttpHeaders(tokenAcquisitionOptions.ExtraHeadersParameters); } + + // Extra Parameters are not meant to be used by Token but by extensions + if (tokenAcquisitionOptions.CorrelationId != null) { builder.WithCorrelationId(tokenAcquisitionOptions.CorrelationId.Value); diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisitionExtensionOptions.cs b/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisitionExtensionOptions.cs new file mode 100644 index 000000000..5fae6f6d0 --- /dev/null +++ b/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisitionExtensionOptions.cs @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.Identity.Abstractions; +using Microsoft.Identity.Client; + +namespace Microsoft.Identity.Web +{ + /// + /// Options for TokenAcquisition add-ins. These options consist in a set of events, that can be subscribed to by add-ins + /// or parts of the add-ins. + /// + public partial class TokenAcquisitionExtensionOptions + { + /// + /// Event fired when the MSAL application needs to be built. + /// + public event BuildApplication? OnBuildConfidentialClientApplication; + + /// + /// Event fired when a client credential flow request is being built. + /// + public event BeforeTokenAcquisitionForApp? OnBeforeTokenAcquisitionForApp; + + /// + /// Event fired when an authentication result is available. + /// + public event AfterTokenAcquisition? OnAfterTokenAcquisition; + + /// + /// Invoke the OnBuildConfidentialClientApplication event. + /// + internal void InvokeOnBuildConfidentialClientApplication(ConfidentialClientApplicationBuilder builder, + AcquireTokenOptions? acquireTokenOptions) + { + if (OnBuildConfidentialClientApplication != null) + { + OnBuildConfidentialClientApplication(builder, acquireTokenOptions); + } + } + + /// + /// Invoke the OnBeforeTokenAcquisitionForApp event. + /// + internal void InvokeOnBeforeTokenAcquisitionForApp(AcquireTokenForClientParameterBuilder builder, + AcquireTokenOptions? acquireTokenOptions) + { + if (OnBeforeTokenAcquisitionForApp != null) + { + OnBeforeTokenAcquisitionForApp(builder, acquireTokenOptions); + } + } + + /// + /// Invoke the OnAfterTokenAcquisition event. + /// + internal void InvokeOnAfterTokenAcquisition(AuthenticationResult result, + AcquireTokenOptions? acquireTokenOptions) + { + if (OnAfterTokenAcquisition != null) + { + OnAfterTokenAcquisition(result, acquireTokenOptions); + } + } + } +} diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisitionExtensions.cs b/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisitionExtensions.cs new file mode 100644 index 000000000..f43d4b2b9 --- /dev/null +++ b/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisitionExtensions.cs @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Identity.Abstractions; +using Microsoft.Identity.Client; + +namespace Microsoft.Identity.Web +{ + /// + /// Signature for token acquisition extensions that act on the application builder. + /// + /// Application builder. + /// Token acquisition options for the request. Can be null. + public delegate void BuildApplication(ConfidentialClientApplicationBuilder confidentialClientApplicationBuilder, AcquireTokenOptions? acquireTokenOptions); + + /// + /// Signature for token acquisition extensions that act on the request builder, for an app token + /// + /// Builder + /// Token acquisition options for the request. Can be null. + public delegate void BeforeTokenAcquisitionForApp(AcquireTokenForClientParameterBuilder builder, AcquireTokenOptions? acquireTokenOptions); + + /// + /// Signature for token acquisition extensions that act on the application builder. + /// + /// MSAL.NET authentication result + /// Token acquisition options for the request. Can be null. + public delegate void AfterTokenAcquisition(AuthenticationResult authResult, AcquireTokenOptions? acquireTokenOptions); +} diff --git a/tests/DevApps/aspnet-mvc/OwinWebApi/Web.config b/tests/DevApps/aspnet-mvc/OwinWebApi/Web.config index 8f5a96f61..a2957522a 100644 --- a/tests/DevApps/aspnet-mvc/OwinWebApi/Web.config +++ b/tests/DevApps/aspnet-mvc/OwinWebApi/Web.config @@ -62,7 +62,7 @@ - + @@ -78,7 +78,7 @@ - + @@ -86,23 +86,23 @@ - + - + - + - + - + diff --git a/tests/DevApps/aspnet-mvc/OwinWebApp/Web.config b/tests/DevApps/aspnet-mvc/OwinWebApp/Web.config index abb766264..65c360704 100644 --- a/tests/DevApps/aspnet-mvc/OwinWebApp/Web.config +++ b/tests/DevApps/aspnet-mvc/OwinWebApp/Web.config @@ -59,7 +59,7 @@ - + @@ -75,7 +75,7 @@ - + @@ -83,23 +83,23 @@ - + - + - + - + - + diff --git a/tests/Microsoft.Identity.Web.Test/TokenAcquisitionAddInTests.cs b/tests/Microsoft.Identity.Web.Test/TokenAcquisitionAddInTests.cs new file mode 100644 index 000000000..deb0a79df --- /dev/null +++ b/tests/Microsoft.Identity.Web.Test/TokenAcquisitionAddInTests.cs @@ -0,0 +1,108 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.Identity.Abstractions; +using Microsoft.Identity.Client; +using Microsoft.Identity.Web.Test.Common.Mocks; +using Microsoft.Identity.Web.Test.Common; +using Xunit; +using System.Threading.Tasks; +using NSubstitute; + +namespace Microsoft.Identity.Web.Tests +{ + public class TokenAcquisitionAddInTests + { + [Fact] + public void InvokeOnBuildConfidentialClientApplication_InvokesEvent() + { + // Arrange + var options = new TokenAcquisitionExtensionOptions(); + var acquireTokenOptions = new AcquireTokenOptions(); + ConfidentialClientApplicationBuilder builderMock = null!; + + bool eventInvoked = false; + options.OnBuildConfidentialClientApplication += (builder, options) => + { + eventInvoked = true; + }; + + // Act + options.InvokeOnBuildConfidentialClientApplication(builderMock, acquireTokenOptions); + + // Assert + Assert.True(eventInvoked); + } + + [Fact] + public async Task InvokeOnBeforeTokenAcquisitionForApp_InvokesEvent() + { + // Arrange + var options = new TokenAcquisitionExtensionOptions(); + var acquireTokenOptions = new AcquireTokenOptions(); + acquireTokenOptions.ForceRefresh = true; + + //Configure mocks + using MockHttpClientFactory mockHttpClient = new(); + mockHttpClient.AddMockHandler(MockHttpCreator.CreateClientCredentialTokenHandler()); + mockHttpClient.AddMockHandler(MockHttpCreator.CreateClientCredentialTokenHandler()); + + var confidentialApp = ConfidentialClientApplicationBuilder + .Create(TestConstants.ClientId) + .WithAuthority(TestConstants.AuthorityCommonTenant) + .WithHttpClientFactory(mockHttpClient) + .WithInstanceDiscovery(false) + .WithClientSecret(TestConstants.ClientSecret) + .Build(); + + AcquireTokenForClientParameterBuilder builder = confidentialApp.AcquireTokenForClient(new string[] { "scope" }); + + //Populate Cache + var result = await builder.ExecuteAsync(); + Assert.NotNull(result); + Assert.True(result.AuthenticationResultMetadata.TokenSource == TokenSource.IdentityProvider); + + bool eventInvoked = false; + options.OnBeforeTokenAcquisitionForApp += (builder, options) => + { + eventInvoked = true; + + //Set ForceRefresh on the builder + builder.WithForceRefresh(options!.ForceRefresh); + }; + + // Act + options.InvokeOnBeforeTokenAcquisitionForApp(builder, acquireTokenOptions); + + //Ensure ForceRefresh is set on the builder + result = await builder.ExecuteAsync(); + + // Assert + Assert.True(eventInvoked); + Assert.NotNull(result); + Assert.Equal(TokenSource.IdentityProvider, result.AuthenticationResultMetadata.TokenSource); + } + + [Fact] + public void InvokeOnAfterTokenAcquisition_InvokesEvent() + { + // Arrange + var options = new TokenAcquisitionExtensionOptions(); + ConfidentialClientApplicationBuilder builderMock = null!; + var resultMock = Substitute.For(); + var acquireTokenOptions = new AcquireTokenOptions(); + + bool eventInvoked = false; + options.OnAfterTokenAcquisition += (result, options) => + { + eventInvoked = true; + }; + + // Act + options.InvokeOnAfterTokenAcquisition(resultMock, acquireTokenOptions); + + // Assert + Assert.True(eventInvoked); + } + } +}