From 1352863dee36a6868889d1bc751d7beea7a92af2 Mon Sep 17 00:00:00 2001 From: Jean-Marc Prieur Date: Thu, 10 Aug 2023 16:02:03 -0700 Subject: [PATCH 1/9] Fix for #2371 In .NET 5+, we now use the DefaultTokenAcquisitionHost (the host for SDK apps) instead of the Asp.NET core one, when the service collection was not initialized by ASP.NET Core (that is the `IWebHostEnvironment` is not present in the collection. If developers want the ASP.NET Core host, they would need to use the WebApplication.CreateBuilder().Services instead of instanciating a simple service collection. --- .../ServiceCollectionExtensions.cs | 22 +++++++++++++++++-- .../DevApps/aspnet-mvc/OwinWebApi/Web.config | 2 +- .../DevApps/aspnet-mvc/OwinWebApp/Web.config | 2 +- .../daemon-app/Daemon-app/Daemon-app.csproj | 2 +- .../TokenAcquirerTests/TokenAcquirer.cs | 11 +++++++++- .../AcquireTokenForAppIntegrationTests.cs | 5 ++++- 6 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/ServiceCollectionExtensions.cs b/src/Microsoft.Identity.Web.TokenAcquisition/ServiceCollectionExtensions.cs index 30e34f5d3..93ed56f4f 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/ServiceCollectionExtensions.cs +++ b/src/Microsoft.Identity.Web.TokenAcquisition/ServiceCollectionExtensions.cs @@ -41,6 +41,10 @@ public static IServiceCollection AddTokenAcquisition( { _ = Throws.IfNull(services); +#if !NETSTANDARD2_0 && !NET462 && !NET472 + bool forceSdk = !services.Any(s => s.ServiceType == typeof(AspNetCore.Hosting.IWebHostEnvironment)); +#endif + if (services.FirstOrDefault(s => s.ImplementationType == typeof(ICredentialsLoader)) == null) { services.AddSingleton(); @@ -88,10 +92,17 @@ public static IServiceCollection AddTokenAcquisition( #if !NETSTANDARD2_0 && !NET462 && !NET472 // ASP.NET Core services.AddHttpContextAccessor(); + if (forceSdk) + { + services.AddSingleton(); + } + else + { + services.AddSingleton(); + } services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); #else // .NET FW. @@ -107,10 +118,17 @@ public static IServiceCollection AddTokenAcquisition( // ASP.NET Core services.AddHttpContextAccessor(); + if (forceSdk) + { + services.AddScoped(); + } + else + { + services.AddScoped(); + } services.AddScoped(); services.AddScoped(); - services.AddScoped(); #else // .NET FW. services.AddScoped(); diff --git a/tests/DevApps/aspnet-mvc/OwinWebApi/Web.config b/tests/DevApps/aspnet-mvc/OwinWebApi/Web.config index 685565e7b..32653ca94 100644 --- a/tests/DevApps/aspnet-mvc/OwinWebApi/Web.config +++ b/tests/DevApps/aspnet-mvc/OwinWebApi/Web.config @@ -98,7 +98,7 @@ - + diff --git a/tests/DevApps/aspnet-mvc/OwinWebApp/Web.config b/tests/DevApps/aspnet-mvc/OwinWebApp/Web.config index c6dfd2b41..7be0d3aee 100644 --- a/tests/DevApps/aspnet-mvc/OwinWebApp/Web.config +++ b/tests/DevApps/aspnet-mvc/OwinWebApp/Web.config @@ -99,7 +99,7 @@ - + diff --git a/tests/DevApps/daemon-app/Daemon-app/Daemon-app.csproj b/tests/DevApps/daemon-app/Daemon-app/Daemon-app.csproj index a0aaf2ad9..f8f63bf48 100644 --- a/tests/DevApps/daemon-app/Daemon-app/Daemon-app.csproj +++ b/tests/DevApps/daemon-app/Daemon-app/Daemon-app.csproj @@ -2,7 +2,7 @@ Exe - net462 + net7.0 Daemon_app enable enable diff --git a/tests/IntegrationTests/TokenAcquirerTests/TokenAcquirer.cs b/tests/IntegrationTests/TokenAcquirerTests/TokenAcquirer.cs index 86e7e7c26..0b9b29995 100644 --- a/tests/IntegrationTests/TokenAcquirerTests/TokenAcquirer.cs +++ b/tests/IntegrationTests/TokenAcquirerTests/TokenAcquirer.cs @@ -33,6 +33,16 @@ public TokenAcquirer() TokenAcquirerFactory.ResetDefaultInstance(); // Test only } + [Fact] + public void TokenAcquirerFactoryDoesNotUseAspNetCoreHost() + { + TokenAcquirerFactory tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance(); + var serviceProvider = tokenAcquirerFactory.Build(); + var service = serviceProvider.GetService(); + Assert.NotNull(service); + Assert.Equal("Microsoft.Identity.Web.Hosts.DefaultTokenAcquisitionHost", service.GetType().FullName); + } + [IgnoreOnAzureDevopsFact] //[Theory] //[InlineData(false)] @@ -43,7 +53,6 @@ public async Task AcquireToken_WithMicrosoftIdentityOptions_ClientCredentialsAsy TokenAcquirerFactory tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance(); IServiceCollection services = tokenAcquirerFactory.Services; - services.Configure(s_optionName, option => { option.Instance = "https://login.microsoftonline.com/"; diff --git a/tests/Microsoft.Identity.Web.Test.Integration/AcquireTokenForAppIntegrationTests.cs b/tests/Microsoft.Identity.Web.Test.Integration/AcquireTokenForAppIntegrationTests.cs index 653b03030..0ba8fdb38 100644 --- a/tests/Microsoft.Identity.Web.Test.Integration/AcquireTokenForAppIntegrationTests.cs +++ b/tests/Microsoft.Identity.Web.Test.Integration/AcquireTokenForAppIntegrationTests.cs @@ -24,6 +24,7 @@ using Xunit.Abstractions; using Microsoft.Identity.Client.Platforms.Features.DesktopOs.Kerberos; using System.Threading; +using Microsoft.AspNetCore.Builder; namespace Microsoft.Identity.Web.Test.Integration { @@ -225,7 +226,8 @@ async Task authResult() => [Fact] public async Task GetAccessTokenForApp_WithAnonymousController_Async() { - var serviceCollection = new ServiceCollection(); + // ASP.NET Core builder. + var serviceCollection = WebApplication.CreateBuilder().Services; var configuration = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary { @@ -243,6 +245,7 @@ public async Task GetAccessTokenForApp_WithAnonymousController_Async() var services = serviceCollection.BuildServiceProvider(); var tokenAcquisition = services.GetRequiredService(); + var tokenAcquisitionHost = services.GetRequiredService(); var token = await tokenAcquisition.GetAccessTokenForAppAsync("https://graph.microsoft.com/.default").ConfigureAwait(false); From 09bb055a3a96bc691f5bb236faa24de588d330a3 Mon Sep 17 00:00:00 2001 From: Jean-Marc Prieur Date: Fri, 11 Aug 2023 12:38:40 -0700 Subject: [PATCH 2/9] Enable TokenAcquisition to use the IdentityPrincipal.Bootstrapcontext - Adds a PrincipalExtensionsForSecurityTokens.GetBootstrapToken method that extracts a Security token from the bootstrap context (+unit tests) - In Web APIs, GetAuthenticationResultForUserAsync tries the BootstrapContext first --- .../OwinTokenAcquisitionHost.cs | 10 +-- .../TokenAcquisitionAspnetCoreHost.cs | 1 - .../PrincipalExtensionsForSecurityTokens.cs | 35 +++++++++ .../TokenAcquisition.cs | 18 ++--- .../Properties/launchSettings.json | 8 ++ ...incipalExtensionsForSecurityTokensTests.cs | 73 +++++++++++++++++++ 6 files changed, 126 insertions(+), 19 deletions(-) create mode 100644 src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs create mode 100644 tests/DevApps/daemon-app/daemon-console-calling-msgraph/Properties/launchSettings.json create mode 100644 tests/Microsoft.Identity.Web.Test/PrincipalExtensionsForSecurityTokensTests.cs diff --git a/src/Microsoft.Identity.Web.OWIN/OwinTokenAcquisitionHost.cs b/src/Microsoft.Identity.Web.OWIN/OwinTokenAcquisitionHost.cs index af38f1214..442dacc9d 100644 --- a/src/Microsoft.Identity.Web.OWIN/OwinTokenAcquisitionHost.cs +++ b/src/Microsoft.Identity.Web.OWIN/OwinTokenAcquisitionHost.cs @@ -8,7 +8,6 @@ using Microsoft.Extensions.Options; using Microsoft.Identity.Abstractions; using Microsoft.Identity.Client; -using Microsoft.IdentityModel.JsonWebTokens; using Microsoft.IdentityModel.Tokens; namespace Microsoft.Identity.Web.Hosts @@ -68,14 +67,7 @@ public MergedOptions GetOptions(string? authenticationScheme, out string effecti public SecurityToken? GetTokenUsedToCallWebAPI() { - object? o = (HttpContext.Current.User.Identity as ClaimsIdentity)?.BootstrapContext; - - if (o != null) - { - // TODO: do better as this won't do for JWE and wastes time. The token was already decrypted. - return new JsonWebToken(o as string); - } - return null; + return HttpContext.Current.User.GetBootstrapToken(); } public ClaimsPrincipal? GetUserFromRequest() diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/AspNetCore/TokenAcquisitionAspnetCoreHost.cs b/src/Microsoft.Identity.Web.TokenAcquisition/AspNetCore/TokenAcquisitionAspnetCoreHost.cs index 2d7403f29..8f3891297 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/AspNetCore/TokenAcquisitionAspnetCoreHost.cs +++ b/src/Microsoft.Identity.Web.TokenAcquisition/AspNetCore/TokenAcquisitionAspnetCoreHost.cs @@ -14,7 +14,6 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Extensions; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Microsoft.Identity.Abstractions; using Microsoft.Identity.Client; diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs b/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs new file mode 100644 index 000000000..a9616eba6 --- /dev/null +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Security.Claims; +using System.Security.Principal; +using Microsoft.IdentityModel.JsonWebTokens; +using Microsoft.IdentityModel.Tokens; + +namespace Microsoft.Identity.Web +{ + /// + /// Extensions to retrive a from . + /// + public static class PrincipalExtensionsForSecurityTokens + { + /// + /// Get the used to call a protected web API. + /// + /// + /// + public static SecurityToken? GetBootstrapToken(this IPrincipal claimsPrincipal) + { + object? o = (claimsPrincipal?.Identity as ClaimsIdentity)?.BootstrapContext; + if (o is SecurityToken securityToken) + { + return securityToken; + } + if (o is string s) + { + return new JsonWebToken(s); + } + return null; + } + } +} diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs b/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs index ac8fa212d..e8ebd551a 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs +++ b/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs @@ -9,11 +9,9 @@ using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Net.Http; -using System.Runtime.CompilerServices; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Identity.Abstractions; using Microsoft.Identity.Client; @@ -245,7 +243,8 @@ public async Task GetAuthenticationResultForUserAsync( tenantId, scopes, tokenAcquisitionOptions, - mergedOptions).ConfigureAwait(false); + mergedOptions, + user).ConfigureAwait(false); if (authenticationResult != null) { @@ -658,12 +657,13 @@ private IConfidentialClientApplication BuildConfidentialClientApplication(Merged string? tenantId, IEnumerable scopes, TokenAcquisitionOptions? tokenAcquisitionOptions, - MergedOptions mergedOptions) + MergedOptions mergedOptions, + ClaimsPrincipal? userHint) { try { // In web API, validatedToken will not be null - SecurityToken? validatedToken = _tokenAcquisitionHost.GetTokenUsedToCallWebAPI(); + SecurityToken? validatedToken = userHint?.GetBootstrapToken() ?? _tokenAcquisitionHost.GetTokenUsedToCallWebAPI(); // In the case the token is a JWE (encrypted token), we use the decrypted token. string? tokenUsedToCallTheWebApi = GetActualToken(validatedToken); @@ -889,7 +889,7 @@ private Task GetAuthenticationResultForWebAppWithAccountFr if (dict != null) { - builder.WithExtraQueryParameters(dict); + builder.WithExtraQueryParameters(dict); } if (tokenAcquisitionOptions.ExtraHeadersParameters != null) { @@ -937,16 +937,16 @@ private Task GetAuthenticationResultForWebAppWithAccountFr { var mergedDict = new Dictionary(tokenAcquisitionOptions.ExtraQueryParameters); if (mergedOptions.ExtraQueryParameters != null) - { + { foreach (var pair in mergedOptions!.ExtraQueryParameters) { if (!mergedDict!.ContainsKey(pair.Key)) mergedDict.Add(pair.Key, pair.Value); - } + } } return mergedDict; } - + return (Dictionary?)mergedOptions.ExtraQueryParameters; } diff --git a/tests/DevApps/daemon-app/daemon-console-calling-msgraph/Properties/launchSettings.json b/tests/DevApps/daemon-app/daemon-console-calling-msgraph/Properties/launchSettings.json new file mode 100644 index 000000000..33504c948 --- /dev/null +++ b/tests/DevApps/daemon-app/daemon-console-calling-msgraph/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "WSL": { + "commandName": "WSL2", + "distributionName": "" + } + } +} \ No newline at end of file diff --git a/tests/Microsoft.Identity.Web.Test/PrincipalExtensionsForSecurityTokensTests.cs b/tests/Microsoft.Identity.Web.Test/PrincipalExtensionsForSecurityTokensTests.cs new file mode 100644 index 000000000..7b90a9804 --- /dev/null +++ b/tests/Microsoft.Identity.Web.Test/PrincipalExtensionsForSecurityTokensTests.cs @@ -0,0 +1,73 @@ +using Microsoft.IdentityModel.JsonWebTokens; +using Microsoft.IdentityModel.Tokens; +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Security.Principal; +using Xunit; + +namespace Microsoft.Identity.Web.Tests +{ + public class PrincipalExtensionsForSecurityTokensTests + { + [Fact] + public void GetBootstrapToken_Returns_Null_When_ClaimsPrincipal_Is_Null() + { + // Arrange + IPrincipal claimsPrincipal = null; + + // Act + var result = claimsPrincipal.GetBootstrapToken(); + + // Assert + Assert.Null(result); + } + + [Fact] + public void GetBootstrapToken_Returns_Null_When_BootstrapContext_Is_Null() + { + // Arrange + IPrincipal claimsPrincipal = new GenericPrincipal(new GenericIdentity(""), null); + + // Act + var result = claimsPrincipal.GetBootstrapToken(); + + // Assert + Assert.Null(result); + } + + [Fact] + public void GetBootstrapToken_Returns_SecurityToken_When_BootstrapContext_Is_SecurityToken() + { + // Arrange + var securityToken = new JwtSecurityToken(); + IPrincipal claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "TestUser") }) + { + BootstrapContext = securityToken + }); + + // Act + var result = claimsPrincipal.GetBootstrapToken(); + + // Assert + Assert.Equal(securityToken, result); + } + + [Fact] + public void GetBootstrapToken_Returns_JsonWebToken_When_BootstrapContext_Is_String() + { + // Arrange + const string jwtString = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"; + IPrincipal claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "TestUser") }) + { + BootstrapContext = jwtString + }); + + // Act + var result = claimsPrincipal.GetBootstrapToken() as JsonWebToken; + + // Assert + Assert.NotNull(result); + Assert.Equal(jwtString, result.EncodedToken); + } + } +} From a857d17e344c9588a8bd867edccf4ef15c0b5d2b Mon Sep 17 00:00:00 2001 From: Jean-Marc Prieur Date: Sun, 13 Aug 2023 13:47:58 -0700 Subject: [PATCH 3/9] - Propagate the user. - Supports extended strings (StringsValues) as the BootstrapContext --- .../PrincipalExtensionsForSecurityTokens.cs | 2 +- src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs b/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs index a9616eba6..3787d8751 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs @@ -29,7 +29,7 @@ public static class PrincipalExtensionsForSecurityTokens { return new JsonWebToken(s); } - return null; + return (o != null) ? new JsonWebToken(o.ToString()) : null; } } } diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs b/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs index e8ebd551a..319d61d8e 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs +++ b/src/Microsoft.Identity.Web.TokenAcquisition/TokenAcquisition.cs @@ -230,7 +230,7 @@ public async Task GetAuthenticationResultForUserAsync( MergedOptions mergedOptions = _tokenAcquisitionHost.GetOptions(authenticationScheme, out _); - user = await _tokenAcquisitionHost.GetAuthenticatedUserAsync(user).ConfigureAwait(false); + user ??= await _tokenAcquisitionHost.GetAuthenticatedUserAsync(user).ConfigureAwait(false); var application = GetOrBuildConfidentialClientApplication(mergedOptions); From 3576e7ca09f392ea0570dc11843e111e3316be28 Mon Sep 17 00:00:00 2001 From: Jean-Marc Prieur Date: Sun, 13 Aug 2023 13:49:07 -0700 Subject: [PATCH 4/9] Update src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs Co-authored-by: jennyf19 --- .../PrincipalExtensionsForSecurityTokens.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs b/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs index 3787d8751..20da364b5 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs @@ -9,7 +9,7 @@ namespace Microsoft.Identity.Web { /// - /// Extensions to retrive a from . + /// Extensions to retrieve a from . /// public static class PrincipalExtensionsForSecurityTokens { From 403ec9940fbab99c2aa50083ba8e354a99affaee Mon Sep 17 00:00:00 2001 From: Jean-Marc Prieur Date: Sun, 13 Aug 2023 14:08:40 -0700 Subject: [PATCH 5/9] Addressing PR feedback --- .../ServiceCollectionExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/ServiceCollectionExtensions.cs b/src/Microsoft.Identity.Web.TokenAcquisition/ServiceCollectionExtensions.cs index 93ed56f4f..c7f01245c 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/ServiceCollectionExtensions.cs +++ b/src/Microsoft.Identity.Web.TokenAcquisition/ServiceCollectionExtensions.cs @@ -89,7 +89,7 @@ public static IServiceCollection AddTokenAcquisition( // Token acquisition service if (isTokenAcquisitionSingleton) { -#if !NETSTANDARD2_0 && !NET462 && !NET472 +#if NETCOREAPP3_1_OR_GREATER // ASP.NET Core services.AddHttpContextAccessor(); if (forceSdk) @@ -114,7 +114,7 @@ public static IServiceCollection AddTokenAcquisition( } else { -#if !NETSTANDARD2_0 && !NET462 && !NET472 +#if NETCOREAPP3_1_OR_GREATER // ASP.NET Core services.AddHttpContextAccessor(); From d8b432a0be3256241befa9e541ca2f4443c9d948 Mon Sep 17 00:00:00 2001 From: Jean-Marc Prieur Date: Sun, 13 Aug 2023 14:10:03 -0700 Subject: [PATCH 6/9] Update src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs Co-authored-by: jennyf19 --- .../PrincipalExtensionsForSecurityTokens.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs b/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs index 20da364b5..88aa35e82 100644 --- a/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs +++ b/src/Microsoft.Identity.Web.TokenAcquisition/PrincipalExtensionsForSecurityTokens.cs @@ -17,7 +17,7 @@ public static class PrincipalExtensionsForSecurityTokens /// Get the used to call a protected web API. /// /// - /// + /// public static SecurityToken? GetBootstrapToken(this IPrincipal claimsPrincipal) { object? o = (claimsPrincipal?.Identity as ClaimsIdentity)?.BootstrapContext; From 3e34c71802059a15b9527ef314b09ba3ea87d0e7 Mon Sep 17 00:00:00 2001 From: Jean-Marc Prieur Date: Sun, 13 Aug 2023 14:10:13 -0700 Subject: [PATCH 7/9] Update tests/Microsoft.Identity.Web.Test/PrincipalExtensionsForSecurityTokensTests.cs Co-authored-by: jennyf19 --- .../PrincipalExtensionsForSecurityTokensTests.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Microsoft.Identity.Web.Test/PrincipalExtensionsForSecurityTokensTests.cs b/tests/Microsoft.Identity.Web.Test/PrincipalExtensionsForSecurityTokensTests.cs index 7b90a9804..1735669c6 100644 --- a/tests/Microsoft.Identity.Web.Test/PrincipalExtensionsForSecurityTokensTests.cs +++ b/tests/Microsoft.Identity.Web.Test/PrincipalExtensionsForSecurityTokensTests.cs @@ -1,3 +1,6 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + using Microsoft.IdentityModel.JsonWebTokens; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; From 87cc1764ae71a377bc870ec27289f7a19c94c5ee Mon Sep 17 00:00:00 2001 From: Jean-Marc Prieur Date: Sun, 13 Aug 2023 15:18:18 -0700 Subject: [PATCH 8/9] Fix warnings --- tests/DevApps/daemon-app/Daemon-app/Program.cs | 9 ++++++++- .../PrincipalExtensionsForSecurityTokensTests.cs | 8 +++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/tests/DevApps/daemon-app/Daemon-app/Program.cs b/tests/DevApps/daemon-app/Daemon-app/Program.cs index f056cfef1..35ec8a7ad 100644 --- a/tests/DevApps/daemon-app/Daemon-app/Program.cs +++ b/tests/DevApps/daemon-app/Daemon-app/Program.cs @@ -38,7 +38,14 @@ static async Task Main(string[] args) var users = await graphServiceClient.Users // Change the protocol if you wish .WithAuthenticationOptions(options => options.ProtocolScheme = "Bearer") .GetAsync(r => r.Options.WithAppOnly()); - Console.WriteLine($"{users.Value.Count} users"); + if (users != null && users.Value!=null) + { + Console.WriteLine($"{users.Value.Count} users"); + } + else + { + Console.WriteLine("No user"); + } #else // Call downstream web API var downstreamApi = serviceProvider.GetRequiredService(); diff --git a/tests/Microsoft.Identity.Web.Test/PrincipalExtensionsForSecurityTokensTests.cs b/tests/Microsoft.Identity.Web.Test/PrincipalExtensionsForSecurityTokensTests.cs index 7b90a9804..0fd360f34 100644 --- a/tests/Microsoft.Identity.Web.Test/PrincipalExtensionsForSecurityTokensTests.cs +++ b/tests/Microsoft.Identity.Web.Test/PrincipalExtensionsForSecurityTokensTests.cs @@ -1,5 +1,7 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + using Microsoft.IdentityModel.JsonWebTokens; -using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Security.Principal; @@ -13,10 +15,10 @@ public class PrincipalExtensionsForSecurityTokensTests public void GetBootstrapToken_Returns_Null_When_ClaimsPrincipal_Is_Null() { // Arrange - IPrincipal claimsPrincipal = null; + IPrincipal? claimsPrincipal = null; // Act - var result = claimsPrincipal.GetBootstrapToken(); + var result = claimsPrincipal?.GetBootstrapToken(); // Assert Assert.Null(result); From 715d445059758a6315fce0f4a3c037f74d259fe1 Mon Sep 17 00:00:00 2001 From: Jean-Marc Prieur Date: Sun, 13 Aug 2023 15:34:29 -0700 Subject: [PATCH 9/9] Fix warning --- .../GraphServiceClientTests/GraphServiceClientTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/IntegrationTests/GraphServiceClientTests/GraphServiceClientTests.cs b/tests/IntegrationTests/GraphServiceClientTests/GraphServiceClientTests.cs index 44b65e461..2c6e6460a 100644 --- a/tests/IntegrationTests/GraphServiceClientTests/GraphServiceClientTests.cs +++ b/tests/IntegrationTests/GraphServiceClientTests/GraphServiceClientTests.cs @@ -18,7 +18,6 @@ public class GraphServiceClientTests #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. #pragma warning disable CS0649 // Field 'GraphServiceClientTests._authorizationHeaderProvider' is never assigned to, and will always have its default value null readonly IAuthorizationHeaderProvider _authorizationHeaderProvider; - readonly GraphServiceClientOptions _defaultAuthenticationOptions; #pragma warning restore CS0649 // Field 'GraphServiceClientTests._authorizationHeaderProvider' is never assigned to, and will always have its default value null #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.