From 813844be0d20ab9284c5ec3bbecdd1ad58cf089a Mon Sep 17 00:00:00 2001 From: jennyf19 Date: Fri, 24 Apr 2020 09:23:34 -0700 Subject: [PATCH] leverage msal.net's httpclient factory (#127) --- .../MsalAspNetCoreHttpClientFactory.cs | 23 +++++++++++++++++++ .../TokenAcquisition.cs | 8 ++++++- .../WebApiAuthenticationBuilderExtensions.cs | 1 + .../WebAppAuthenticationBuilderExtensions.cs | 1 + .../AcquireTokenForAppIntegrationTests.cs | 6 ++++- .../TodoListService/appsettings.json | 5 ++-- 6 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 src/Microsoft.Identity.Web/MsalAspNetCoreHttpClientFactory.cs diff --git a/src/Microsoft.Identity.Web/MsalAspNetCoreHttpClientFactory.cs b/src/Microsoft.Identity.Web/MsalAspNetCoreHttpClientFactory.cs new file mode 100644 index 000000000..1f3f33934 --- /dev/null +++ b/src/Microsoft.Identity.Web/MsalAspNetCoreHttpClientFactory.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.Identity.Client; +using System.Net.Http; + +namespace Microsoft.Identity.Web +{ + internal class MsalAspNetCoreHttpClientFactory : IMsalHttpClientFactory + { + private IHttpClientFactory _httpClientFactory; + + public MsalAspNetCoreHttpClientFactory(IHttpClientFactory httpClientFactory) + { + _httpClientFactory = httpClientFactory; + } + + public HttpClient GetHttpClient() + { + return _httpClientFactory.CreateClient(); + } + } +} diff --git a/src/Microsoft.Identity.Web/TokenAcquisition.cs b/src/Microsoft.Identity.Web/TokenAcquisition.cs index 5b4cfe7f1..8d5649efa 100644 --- a/src/Microsoft.Identity.Web/TokenAcquisition.cs +++ b/src/Microsoft.Identity.Web/TokenAcquisition.cs @@ -15,6 +15,7 @@ using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Net; +using System.Net.Http; using System.Security.Claims; using System.Threading.Tasks; @@ -33,6 +34,7 @@ internal class TokenAcquisition : ITokenAcquisition, ITokenAcquisitionInternal private IConfidentialClientApplication _application; private readonly IHttpContextAccessor _httpContextAccessor; private HttpContext CurrentHttpContext => _httpContextAccessor.HttpContext; + private IMsalHttpClientFactory _httpClientFactory; private readonly ILogger _logger; /// @@ -48,12 +50,14 @@ public TokenAcquisition( IHttpContextAccessor httpContextAccessor, IOptions microsoftIdentityOptions, IOptions applicationOptions, + IHttpClientFactory httpClientFactory, ILogger logger) { _httpContextAccessor = httpContextAccessor; _microsoftIdentityOptions = microsoftIdentityOptions.Value; _applicationOptions = applicationOptions.Value; _tokenCacheProvider = tokenCacheProvider; + _httpClientFactory = new MsalAspNetCoreHttpClientFactory(httpClientFactory); _logger = logger; } @@ -337,7 +341,7 @@ private async Task BuildConfidentialClientApplic request.PathBase, _microsoftIdentityOptions.CallbackPath.Value ?? string.Empty); - if (!_applicationOptions.Instance.EndsWith("/")) + if (!_applicationOptions.Instance.EndsWith("/", StringComparison.InvariantCulture)) _applicationOptions.Instance += "/"; string authority; @@ -352,6 +356,7 @@ private async Task BuildConfidentialClientApplic .CreateWithApplicationOptions(_applicationOptions) .WithRedirectUri(currentUri) .WithB2CAuthority(authority) + .WithHttpClientFactory(_httpClientFactory) .Build(); } else @@ -362,6 +367,7 @@ private async Task BuildConfidentialClientApplic .CreateWithApplicationOptions(_applicationOptions) .WithRedirectUri(currentUri) .WithAuthority(authority) + .WithHttpClientFactory(_httpClientFactory) .Build(); } diff --git a/src/Microsoft.Identity.Web/WebApiAuthenticationBuilderExtensions.cs b/src/Microsoft.Identity.Web/WebApiAuthenticationBuilderExtensions.cs index c36f6502f..60801812d 100644 --- a/src/Microsoft.Identity.Web/WebApiAuthenticationBuilderExtensions.cs +++ b/src/Microsoft.Identity.Web/WebApiAuthenticationBuilderExtensions.cs @@ -74,6 +74,7 @@ public static AuthenticationBuilder AddProtectedWebApi( builder.Services.AddHttpContextAccessor(); builder.Services.AddSingleton(); + builder.Services.AddHttpClient(); // Change the authentication configuration to accommodate the Microsoft identity platform endpoint (v2.0). builder.AddJwtBearer(jwtBearerScheme, options => diff --git a/src/Microsoft.Identity.Web/WebAppAuthenticationBuilderExtensions.cs b/src/Microsoft.Identity.Web/WebAppAuthenticationBuilderExtensions.cs index 62e10f760..a8e36ad7a 100644 --- a/src/Microsoft.Identity.Web/WebAppAuthenticationBuilderExtensions.cs +++ b/src/Microsoft.Identity.Web/WebAppAuthenticationBuilderExtensions.cs @@ -67,6 +67,7 @@ public static AuthenticationBuilder AddSignIn( { builder.Services.Configure(openIdConnectScheme, configureOpenIdConnectOptions); builder.Services.Configure(configureMicrosoftIdentityOptions); + builder.Services.AddHttpClient(); var microsoftIdentityOptions = new MicrosoftIdentityOptions(); configureMicrosoftIdentityOptions(microsoftIdentityOptions); diff --git a/tests/Microsoft.Identity.Web.Test.Integration/AcquireTokenForAppIntegrationTests.cs b/tests/Microsoft.Identity.Web.Test.Integration/AcquireTokenForAppIntegrationTests.cs index 44f3f462e..8d6761f46 100644 --- a/tests/Microsoft.Identity.Web.Test.Integration/AcquireTokenForAppIntegrationTests.cs +++ b/tests/Microsoft.Identity.Web.Test.Integration/AcquireTokenForAppIntegrationTests.cs @@ -13,6 +13,7 @@ using Microsoft.Identity.Web.TokenCacheProviders.InMemory; using NSubstitute; using System; +using System.Net.Http; using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -70,7 +71,7 @@ public async Task GetAccessTokenForApp_ReturnsAccessTokenAsync() [Fact] public async Task GetAccessTokenForApp_WithUserScope_MsalServiceExceptionThrownAsync() { - // Arrange + // Arrange InitializeTokenAcquisitionObjects(); // Act & Assert @@ -91,6 +92,7 @@ private void InitializeTokenAcquisitionObjects() IOptions tokenOptions = _provider.GetService>(); IOptions ccOptions = _provider.GetService>(); ILogger logger = _provider.GetService>(); + IHttpClientFactory httpClientFactory = _provider.GetService(); IHttpContextAccessor httpContextAccessor = CreateMockHttpContextAccessor(); @@ -105,6 +107,7 @@ private void InitializeTokenAcquisitionObjects() httpContextAccessor, microsoftIdentityOptions, ccOptions, + httpClientFactory, logger); } @@ -141,6 +144,7 @@ private void BuildTheRequiredServices() )); services.AddLogging(); services.AddInMemoryTokenCaches(); + services.AddHttpClient(); _provider = services.BuildServiceProvider(); } diff --git a/tests/WebAppCallsWebApiCallsGraph/TodoListService/appsettings.json b/tests/WebAppCallsWebApiCallsGraph/TodoListService/appsettings.json index 20ac4f4f6..2742b4fca 100644 --- a/tests/WebAppCallsWebApiCallsGraph/TodoListService/appsettings.json +++ b/tests/WebAppCallsWebApiCallsGraph/TodoListService/appsettings.json @@ -4,8 +4,7 @@ "Domain": "msidentitysamplestesting.onmicrosoft.com", "TenantId": "7f58f645-c190-4ce5-9de4-e2b7acd2a6ab", "ClientId": "a4c2469b-cf84-4145-8f5f-cb7bacf814bc" - } - , + }, "Kestrel": { "Endpoints": { "Http": { @@ -19,4 +18,4 @@ } }, "AllowedHosts": "*" -} +} \ No newline at end of file