From f99923e1a0f2276d448f5ffd39dca00414fd9c6f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 21:55:50 +0000 Subject: [PATCH 01/13] Initial plan From f4aa95664d0f72ae92ce6200c93e5f7e53c83cf5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 22:04:10 +0000 Subject: [PATCH 02/13] Register UserManagerMetrics and SignInManagerMetrics in DI container Co-authored-by: captainsafia <1857993+captainsafia@users.noreply.github.com> --- src/Identity/Core/src/IdentityBuilderExtensions.cs | 1 + src/Identity/Core/src/IdentityServiceCollectionExtensions.cs | 2 ++ .../Extensions.Core/src/IdentityServiceCollectionExtensions.cs | 1 + 3 files changed, 4 insertions(+) diff --git a/src/Identity/Core/src/IdentityBuilderExtensions.cs b/src/Identity/Core/src/IdentityBuilderExtensions.cs index e97fec9ad6ac..05a7fd3c8798 100644 --- a/src/Identity/Core/src/IdentityBuilderExtensions.cs +++ b/src/Identity/Core/src/IdentityBuilderExtensions.cs @@ -45,6 +45,7 @@ private static void AddSignInManagerDeps(this IdentityBuilder builder) builder.Services.AddScoped(typeof(ISecurityStampValidator), typeof(SecurityStampValidator<>).MakeGenericType(builder.UserType)); builder.Services.AddScoped(typeof(ITwoFactorSecurityStampValidator), typeof(TwoFactorSecurityStampValidator<>).MakeGenericType(builder.UserType)); builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton, PostConfigureSecurityStampValidatorOptions>()); + builder.Services.TryAddSingleton(); } /// diff --git a/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs b/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs index eceb93d32034..f695ac03b6dd 100644 --- a/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs +++ b/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs @@ -103,6 +103,8 @@ public static class IdentityServiceCollectionExtensions services.TryAddScoped, UserClaimsPrincipalFactory>(); services.TryAddScoped, DefaultUserConfirmation>(); services.TryAddScoped, PasskeyHandler>(); + services.TryAddSingleton(); + services.TryAddSingleton(); services.TryAddScoped>(); services.TryAddScoped>(); services.TryAddScoped>(); diff --git a/src/Identity/Extensions.Core/src/IdentityServiceCollectionExtensions.cs b/src/Identity/Extensions.Core/src/IdentityServiceCollectionExtensions.cs index 28415c47318d..f933b56097a1 100644 --- a/src/Identity/Extensions.Core/src/IdentityServiceCollectionExtensions.cs +++ b/src/Identity/Extensions.Core/src/IdentityServiceCollectionExtensions.cs @@ -45,6 +45,7 @@ public static IdentityBuilder AddIdentityCore(this IServiceCollection ser // No interface for the error describer so we can add errors without rev'ing the interface services.TryAddScoped(); services.TryAddScoped, UserClaimsPrincipalFactory>(); + services.TryAddSingleton(); services.TryAddScoped>(); if (setupAction != null) From 6eed689b63c76cbd5ce89c0055a0ce9fe30211bc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 22:22:57 +0000 Subject: [PATCH 03/13] Add InternalsVisibleTo and remove duplicate shared source files to enable UserManagerMetrics registration Co-authored-by: captainsafia <1857993+captainsafia@users.noreply.github.com> --- src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj | 2 -- .../src/Microsoft.Extensions.Identity.Core.csproj | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj b/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj index 5f13920b61f5..7464f3dbfd72 100644 --- a/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj +++ b/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj @@ -14,8 +14,6 @@ - - diff --git a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj index 538396395fc3..0b19741476d9 100644 --- a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj +++ b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj @@ -29,6 +29,7 @@ + From 749b76db1770ce26a41a7178fcdfe43d6b0f55e8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 23:39:43 +0000 Subject: [PATCH 04/13] Remove InternalsVisibleTo between product assemblies per feedback Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com> --- src/Identity/Core/src/IdentityServiceCollectionExtensions.cs | 1 - src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj | 2 ++ .../src/Microsoft.Extensions.Identity.Core.csproj | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs b/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs index f695ac03b6dd..9d13e4dd763a 100644 --- a/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs +++ b/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs @@ -103,7 +103,6 @@ public static class IdentityServiceCollectionExtensions services.TryAddScoped, UserClaimsPrincipalFactory>(); services.TryAddScoped, DefaultUserConfirmation>(); services.TryAddScoped, PasskeyHandler>(); - services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddScoped>(); services.TryAddScoped>(); diff --git a/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj b/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj index 7464f3dbfd72..5f13920b61f5 100644 --- a/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj +++ b/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj @@ -14,6 +14,8 @@ + + diff --git a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj index 0b19741476d9..538396395fc3 100644 --- a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj +++ b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj @@ -29,7 +29,6 @@ - From bb2a0078fa4edb92c4d0cf7c945633bc2e70eae1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 23:56:01 +0000 Subject: [PATCH 05/13] Instantiate metrics classes directly instead of registering in DI Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com> --- src/Identity/Core/src/IdentityBuilderExtensions.cs | 1 - src/Identity/Core/src/IdentityServiceCollectionExtensions.cs | 1 - src/Identity/Core/src/SignInManager.cs | 5 ++++- .../src/IdentityServiceCollectionExtensions.cs | 1 - src/Identity/Extensions.Core/src/UserManager.cs | 5 ++++- src/Identity/test/Shared/MockHelpers.cs | 3 --- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Identity/Core/src/IdentityBuilderExtensions.cs b/src/Identity/Core/src/IdentityBuilderExtensions.cs index 05a7fd3c8798..e97fec9ad6ac 100644 --- a/src/Identity/Core/src/IdentityBuilderExtensions.cs +++ b/src/Identity/Core/src/IdentityBuilderExtensions.cs @@ -45,7 +45,6 @@ private static void AddSignInManagerDeps(this IdentityBuilder builder) builder.Services.AddScoped(typeof(ISecurityStampValidator), typeof(SecurityStampValidator<>).MakeGenericType(builder.UserType)); builder.Services.AddScoped(typeof(ITwoFactorSecurityStampValidator), typeof(TwoFactorSecurityStampValidator<>).MakeGenericType(builder.UserType)); builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton, PostConfigureSecurityStampValidatorOptions>()); - builder.Services.TryAddSingleton(); } /// diff --git a/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs b/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs index 9d13e4dd763a..eceb93d32034 100644 --- a/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs +++ b/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs @@ -103,7 +103,6 @@ public static class IdentityServiceCollectionExtensions services.TryAddScoped, UserClaimsPrincipalFactory>(); services.TryAddScoped, DefaultUserConfirmation>(); services.TryAddScoped, PasskeyHandler>(); - services.TryAddSingleton(); services.TryAddScoped>(); services.TryAddScoped>(); services.TryAddScoped>(); diff --git a/src/Identity/Core/src/SignInManager.cs b/src/Identity/Core/src/SignInManager.cs index 2391e36c0e72..614aef11f9e9 100644 --- a/src/Identity/Core/src/SignInManager.cs +++ b/src/Identity/Core/src/SignInManager.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Metrics; using System.Linq; using System.Security.Claims; using System.Text; @@ -63,7 +64,9 @@ public SignInManager(UserManager userManager, Logger = logger; _schemes = schemes; _confirmation = confirmation; - _metrics = userManager.ServiceProvider?.GetService(); + + var meterFactory = userManager.ServiceProvider?.GetService(); + _metrics = meterFactory != null ? new SignInManagerMetrics(meterFactory) : null; _passkeyHandler = userManager.ServiceProvider?.GetService>(); } diff --git a/src/Identity/Extensions.Core/src/IdentityServiceCollectionExtensions.cs b/src/Identity/Extensions.Core/src/IdentityServiceCollectionExtensions.cs index f933b56097a1..28415c47318d 100644 --- a/src/Identity/Extensions.Core/src/IdentityServiceCollectionExtensions.cs +++ b/src/Identity/Extensions.Core/src/IdentityServiceCollectionExtensions.cs @@ -45,7 +45,6 @@ public static IdentityBuilder AddIdentityCore(this IServiceCollection ser // No interface for the error describer so we can add errors without rev'ing the interface services.TryAddScoped(); services.TryAddScoped, UserClaimsPrincipalFactory>(); - services.TryAddSingleton(); services.TryAddScoped>(); if (setupAction != null) diff --git a/src/Identity/Extensions.Core/src/UserManager.cs b/src/Identity/Extensions.Core/src/UserManager.cs index e184534b41ce..34a1284eae50 100644 --- a/src/Identity/Extensions.Core/src/UserManager.cs +++ b/src/Identity/Extensions.Core/src/UserManager.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Metrics; using System.Linq; using System.Runtime.InteropServices; using System.Security.Claims; @@ -85,7 +86,9 @@ public UserManager(IUserStore store, ErrorDescriber = errors; Logger = logger; ServiceProvider = services; - _metrics = services?.GetService(); + + var meterFactory = services?.GetService(); + _metrics = meterFactory != null ? new UserManagerMetrics(meterFactory) : null; if (userValidators != null) { diff --git a/src/Identity/test/Shared/MockHelpers.cs b/src/Identity/test/Shared/MockHelpers.cs index f6d374c6769e..309cbfc07196 100644 --- a/src/Identity/test/Shared/MockHelpers.cs +++ b/src/Identity/test/Shared/MockHelpers.cs @@ -22,7 +22,6 @@ public static Mock> MockUserManager( var services = new ServiceCollection(); if (meterFactory != null) { - services.AddSingleton(); services.AddSingleton(meterFactory); } if (passkeyHandler != null) @@ -61,8 +60,6 @@ public static UserManager TestUserManager(IUserStore store var services = new ServiceCollection(); if (meterFactory != null) { - services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(meterFactory); } var userManager = new UserManager(store, options.Object, new PasswordHasher(), From 7b2ae0466665cedaee26f39eb7555698ab7389a8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 7 Nov 2025 00:41:18 +0000 Subject: [PATCH 06/13] Add AddMetrics() call when registering UserManager and SignInManager Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com> --- src/Identity/Core/src/IdentityServiceCollectionExtensions.cs | 1 + src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj | 1 + .../Extensions.Core/src/IdentityServiceCollectionExtensions.cs | 1 + .../src/Microsoft.Extensions.Identity.Core.csproj | 1 + 4 files changed, 4 insertions(+) diff --git a/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs b/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs index eceb93d32034..3571fa7f2d02 100644 --- a/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs +++ b/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs @@ -89,6 +89,7 @@ public static class IdentityServiceCollectionExtensions // Hosting doesn't add IHttpContextAccessor by default services.AddHttpContextAccessor(); + services.AddMetrics(); // Identity services services.TryAddScoped, UserValidator>(); services.TryAddScoped, PasswordValidator>(); diff --git a/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj b/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj index 5f13920b61f5..82a750e1393c 100644 --- a/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj +++ b/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj @@ -23,6 +23,7 @@ + diff --git a/src/Identity/Extensions.Core/src/IdentityServiceCollectionExtensions.cs b/src/Identity/Extensions.Core/src/IdentityServiceCollectionExtensions.cs index 28415c47318d..b7ed1a7652c7 100644 --- a/src/Identity/Extensions.Core/src/IdentityServiceCollectionExtensions.cs +++ b/src/Identity/Extensions.Core/src/IdentityServiceCollectionExtensions.cs @@ -35,6 +35,7 @@ public static IdentityBuilder AddIdentityCore(this IServiceCollection ser { // Services identity depends on services.AddOptions().AddLogging(); + services.AddMetrics(); // Services used by identity services.TryAddScoped, UserValidator>(); diff --git a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj index 538396395fc3..534517af55d2 100644 --- a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj +++ b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj @@ -12,6 +12,7 @@ + From 756e4f0f0f3d74f12c56efd14a41d28259dd0bd5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 7 Nov 2025 01:06:38 +0000 Subject: [PATCH 07/13] Add test to verify metrics are recorded for UserManager and SignInManager Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com> --- .../MapIdentityApiTests.cs | 42 +++++++++++++++++++ ...AspNetCore.Identity.FunctionalTests.csproj | 2 + 2 files changed, 44 insertions(+) diff --git a/src/Identity/test/Identity.FunctionalTests/MapIdentityApiTests.cs b/src/Identity/test/Identity.FunctionalTests/MapIdentityApiTests.cs index fbce29d8f6e4..118de1ec87ca 100644 --- a/src/Identity/test/Identity.FunctionalTests/MapIdentityApiTests.cs +++ b/src/Identity/test/Identity.FunctionalTests/MapIdentityApiTests.cs @@ -3,6 +3,7 @@ #nullable enable +using System.Diagnostics.Metrics; using System.Globalization; using System.Net; using System.Net.Http; @@ -23,6 +24,8 @@ using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.Metrics; +using Microsoft.Extensions.Diagnostics.Metrics.Testing; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Time.Testing; using Microsoft.Net.Http.Headers; @@ -1274,6 +1277,45 @@ public async Task MustSendValidRequestToSendEmailChangeConfirmation() AssertOk(await client.PostAsJsonAsync("/identity/login", new { Email = newEmail, Password = newPassword })); } + [Fact] + public async Task MetricsAreRecordedForUserManagerAndSignInManager() + { + // Arrange + var meterFactory = new TestMeterFactory(); + + await using var app = await CreateAppAsync(services => + { + AddIdentityApiEndpoints(services); + services.AddSingleton(meterFactory); + }); + using var client = app.GetTestClient(); + + using var userCreateCollector = new MetricCollector(meterFactory, "Microsoft.AspNetCore.Identity", "aspnetcore.identity.user.create.duration"); + using var signInAuthenticateCollector = new MetricCollector(meterFactory, "Microsoft.AspNetCore.Identity", "aspnetcore.identity.sign_in.authenticate.duration"); + + // Act - Register a new user + AssertOkAndEmpty(await client.PostAsJsonAsync("/identity/register", new { Email, Password })); + + // Assert - UserManager metrics are recorded + var userCreateMeasurement = Assert.Single(userCreateCollector.GetMeasurementSnapshot()); + Assert.True(userCreateMeasurement.Value > 0); + Assert.Equal("Identity.DefaultUI.WebSite.ApplicationUser", (string?)userCreateMeasurement.Tags["aspnetcore.identity.user_type"]); + Assert.Equal("success", (string?)userCreateMeasurement.Tags["aspnetcore.identity.result"]); + + // Act - Login with the user + AssertOk(await client.PostAsJsonAsync("/identity/login", new { Email, Password })); + + // Assert - SignInManager metrics are recorded + var signInMeasurements = signInAuthenticateCollector.GetMeasurementSnapshot(); + Assert.NotEmpty(signInMeasurements); + var signInMeasurement = signInMeasurements.Last(); + Assert.True(signInMeasurement.Value > 0); + Assert.Equal("Identity.DefaultUI.WebSite.ApplicationUser", (string?)signInMeasurement.Tags["aspnetcore.identity.user_type"]); + Assert.Equal("Identity.Bearer", (string?)signInMeasurement.Tags["aspnetcore.authentication.scheme"]); + Assert.Equal("success", (string?)signInMeasurement.Tags["aspnetcore.identity.sign_in.result"]); + Assert.Equal("password", (string?)signInMeasurement.Tags["aspnetcore.identity.sign_in.type"]); + } + private async Task CreateAppAsync(Action? configureServices, bool autoStart = true) where TUser : class, new() where TContext : DbContext diff --git a/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj b/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj index 88bbd988b1f3..2241de1e3972 100644 --- a/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj +++ b/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj @@ -8,6 +8,7 @@ + @@ -22,6 +23,7 @@ + From 4c4bb00c40e1881ceb145913a29aa2f93b2f2e85 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 7 Nov 2025 09:14:04 +0800 Subject: [PATCH 08/13] Update --- .../test/Identity.FunctionalTests/MapIdentityApiTests.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Identity/test/Identity.FunctionalTests/MapIdentityApiTests.cs b/src/Identity/test/Identity.FunctionalTests/MapIdentityApiTests.cs index 118de1ec87ca..c9bb52658877 100644 --- a/src/Identity/test/Identity.FunctionalTests/MapIdentityApiTests.cs +++ b/src/Identity/test/Identity.FunctionalTests/MapIdentityApiTests.cs @@ -1281,13 +1281,12 @@ public async Task MustSendValidRequestToSendEmailChangeConfirmation() public async Task MetricsAreRecordedForUserManagerAndSignInManager() { // Arrange - var meterFactory = new TestMeterFactory(); - await using var app = await CreateAppAsync(services => { AddIdentityApiEndpoints(services); - services.AddSingleton(meterFactory); }); + var meterFactory = app.Services.GetRequiredService(); + using var client = app.GetTestClient(); using var userCreateCollector = new MetricCollector(meterFactory, "Microsoft.AspNetCore.Identity", "aspnetcore.identity.user.create.duration"); From 5bbe4f608ab1f7429ddfd05020e83e3f9f7a3790 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 7 Nov 2025 09:18:07 +0800 Subject: [PATCH 09/13] Update --- .../Microsoft.AspNetCore.Identity.FunctionalTests.csproj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj b/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj index 2241de1e3972..e8ec634bb07d 100644 --- a/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj +++ b/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj @@ -1,4 +1,4 @@ - + true $(DefaultNetCoreTargetFramework) @@ -8,7 +8,6 @@ - From b6491f25e38e1057d5e7bd2c926d3b4352bbbafd Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 7 Nov 2025 10:08:10 +0800 Subject: [PATCH 10/13] Update src/Identity/Extensions.Core/src/UserManager.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/Identity/Extensions.Core/src/UserManager.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Identity/Extensions.Core/src/UserManager.cs b/src/Identity/Extensions.Core/src/UserManager.cs index 34a1284eae50..b448df92025b 100644 --- a/src/Identity/Extensions.Core/src/UserManager.cs +++ b/src/Identity/Extensions.Core/src/UserManager.cs @@ -87,9 +87,7 @@ public UserManager(IUserStore store, Logger = logger; ServiceProvider = services; - var meterFactory = services?.GetService(); - _metrics = meterFactory != null ? new UserManagerMetrics(meterFactory) : null; - + _metrics = services?.GetService() is { } factory ? new UserManagerMetrics(factory) : null; if (userValidators != null) { foreach (var v in userValidators) From 5cb5b23a961cc5565342a84f82ff98849f0ac285 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 7 Nov 2025 10:08:16 +0800 Subject: [PATCH 11/13] Update src/Identity/Core/src/SignInManager.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/Identity/Core/src/SignInManager.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Identity/Core/src/SignInManager.cs b/src/Identity/Core/src/SignInManager.cs index 614aef11f9e9..4e3b4ffa46b1 100644 --- a/src/Identity/Core/src/SignInManager.cs +++ b/src/Identity/Core/src/SignInManager.cs @@ -65,8 +65,7 @@ public SignInManager(UserManager userManager, _schemes = schemes; _confirmation = confirmation; - var meterFactory = userManager.ServiceProvider?.GetService(); - _metrics = meterFactory != null ? new SignInManagerMetrics(meterFactory) : null; + _metrics = userManager.ServiceProvider?.GetService() is { } factory ? new SignInManagerMetrics(factory) : null; _passkeyHandler = userManager.ServiceProvider?.GetService>(); } From 2d6feec0e92cbc88c3ec00691a9506b1b6dc0c83 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 7 Nov 2025 10:09:23 +0800 Subject: [PATCH 12/13] Apply suggestion from @JamesNK --- src/Identity/Core/src/SignInManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Identity/Core/src/SignInManager.cs b/src/Identity/Core/src/SignInManager.cs index 4e3b4ffa46b1..4d139a408828 100644 --- a/src/Identity/Core/src/SignInManager.cs +++ b/src/Identity/Core/src/SignInManager.cs @@ -64,7 +64,7 @@ public SignInManager(UserManager userManager, Logger = logger; _schemes = schemes; _confirmation = confirmation; - + // SignInManagerMetrics created from constructor because of difficulties registering internal type. _metrics = userManager.ServiceProvider?.GetService() is { } factory ? new SignInManagerMetrics(factory) : null; _passkeyHandler = userManager.ServiceProvider?.GetService>(); } From 11f51f7c964ff57aa4dc35b353a863eb584b072a Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 7 Nov 2025 10:09:49 +0800 Subject: [PATCH 13/13] Apply suggestion from @JamesNK --- src/Identity/Extensions.Core/src/UserManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Identity/Extensions.Core/src/UserManager.cs b/src/Identity/Extensions.Core/src/UserManager.cs index b448df92025b..cfb6f717ccff 100644 --- a/src/Identity/Extensions.Core/src/UserManager.cs +++ b/src/Identity/Extensions.Core/src/UserManager.cs @@ -86,8 +86,9 @@ public UserManager(IUserStore store, ErrorDescriber = errors; Logger = logger; ServiceProvider = services; - + // UserManagerMetrics created from constructor because of difficulties registering internal type. _metrics = services?.GetService() is { } factory ? new UserManagerMetrics(factory) : null; + if (userValidators != null) { foreach (var v in userValidators)