diff --git a/src/Microsoft.Identity.Web/MergedOptions.cs b/src/Microsoft.Identity.Web/MergedOptions.cs index 3766b9b27..43949ebc5 100644 --- a/src/Microsoft.Identity.Web/MergedOptions.cs +++ b/src/Microsoft.Identity.Web/MergedOptions.cs @@ -65,6 +65,17 @@ internal static void UpdateMergedOptionsFromMicrosoftIdentityOptions(MicrosoftId mergedOptions.BackchannelHttpHandler ??= microsoftIdentityOptions.BackchannelHttpHandler; mergedOptions.BackchannelTimeout = microsoftIdentityOptions.BackchannelTimeout; mergedOptions.CallbackPath = microsoftIdentityOptions.CallbackPath; + + mergedOptions.ClaimActions.Clear(); + + foreach (var claimAction in microsoftIdentityOptions.ClaimActions) + { + if (!mergedOptions.ClaimActions.Contains(claimAction)) + { + mergedOptions.ClaimActions.Add(claimAction); + } + } + if (string.IsNullOrEmpty(mergedOptions.ClaimsIssuer) && !string.IsNullOrEmpty(microsoftIdentityOptions.ClaimsIssuer)) { mergedOptions.ClaimsIssuer = microsoftIdentityOptions.ClaimsIssuer; diff --git a/tests/Microsoft.Identity.Web.Test/MicrosoftIdentityOptionsTests.cs b/tests/Microsoft.Identity.Web.Test/MicrosoftIdentityOptionsTests.cs index 461032b21..3e5e3c194 100644 --- a/tests/Microsoft.Identity.Web.Test/MicrosoftIdentityOptionsTests.cs +++ b/tests/Microsoft.Identity.Web.Test/MicrosoftIdentityOptionsTests.cs @@ -3,7 +3,11 @@ using System; using System.Globalization; +using System.Linq; +using System.Security.Claims; +using Microsoft.AspNetCore.Authentication.OAuth.Claims; using Microsoft.AspNetCore.Authentication.OpenIdConnect; +using Microsoft.AspNetCore.Authentication.OpenIdConnect.Claims; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Microsoft.Identity.Client; @@ -102,6 +106,41 @@ public void ValidateRequiredMicrosoftIdentityOptions( } } + [Fact] + public void TestMergedOptions_ContainsClaimsActions() + { + + _microsoftIdentityOptionsMonitor = new TestOptionsMonitor(new MicrosoftIdentityOptions + { + ClaimActions = + { + new UniqueJsonKeyClaimAction(ClaimTypes.Gender, "string", "sex"), + }, + }); + + BuildTheRequiredServices(); + MergedOptions mergedOptions = _provider.GetRequiredService>().Get(OpenIdConnectDefaults.AuthenticationScheme); + + MergedOptions.UpdateMergedOptionsFromMicrosoftIdentityOptions(_microsoftIdentityOptionsMonitor.Get(OpenIdConnectDefaults.AuthenticationScheme), mergedOptions); + + // Verify that the mergedOptions.ClaimActions has claims + // It should contain some default ones along with our added one + Assert.NotEmpty(mergedOptions.ClaimActions.AsEnumerable()); + + // See if we can find the ClaimAction that we added + Assert.Contains(mergedOptions.ClaimActions, action => action.ClaimType == ClaimTypes.Gender); + + // Select the single ClaimAction from the collection + var genderClaim = mergedOptions.ClaimActions.Single(x => x.ClaimType == ClaimTypes.Gender); + + // Assert its a type of UniqueJsonKeyClaimAction + Assert.IsType(genderClaim); + + // Ensure gender has the value of sex + var jsonKeyClaim = genderClaim as UniqueJsonKeyClaimAction; + Assert.Equal(jsonKeyClaim.JsonKey, "sex"); + } + private void BuildTheRequiredServices() { var services = new ServiceCollection();