Skip to content

Commit 362a8f6

Browse files
committed
Remove new SignInManager constructor
1 parent 5c080ac commit 362a8f6

File tree

6 files changed

+26
-46
lines changed

6 files changed

+26
-46
lines changed

src/Identity/Core/src/PublicAPI.Unshipped.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ Microsoft.AspNetCore.Identity.PasskeyUserEntity.Id.init -> void
100100
Microsoft.AspNetCore.Identity.PasskeyUserEntity.Name.get -> string!
101101
Microsoft.AspNetCore.Identity.PasskeyUserEntity.Name.init -> void
102102
Microsoft.AspNetCore.Identity.PasskeyUserEntity.PasskeyUserEntity() -> void
103-
Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInManager(Microsoft.AspNetCore.Identity.UserManager<TUser!>! userManager, Microsoft.AspNetCore.Http.IHttpContextAccessor! contextAccessor, Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser!>! claimsFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! optionsAccessor, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.SignInManager<TUser!>!>! logger, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! schemes, Microsoft.AspNetCore.Identity.IUserConfirmation<TUser!>! confirmation, Microsoft.AspNetCore.Identity.IPasskeyHandler<TUser!>! passkeyHandler) -> void
104103
static Microsoft.AspNetCore.Identity.PasskeyAssertionResult.Fail<TUser>(Microsoft.AspNetCore.Identity.PasskeyException! failure) -> Microsoft.AspNetCore.Identity.PasskeyAssertionResult<TUser!>!
105104
static Microsoft.AspNetCore.Identity.PasskeyAssertionResult.Success<TUser>(Microsoft.AspNetCore.Identity.UserPasskeyInfo! passkey, TUser! user) -> Microsoft.AspNetCore.Identity.PasskeyAssertionResult<TUser!>!
106105
static Microsoft.AspNetCore.Identity.PasskeyAttestationResult.Fail(Microsoft.AspNetCore.Identity.PasskeyException! failure) -> Microsoft.AspNetCore.Identity.PasskeyAttestationResult!

src/Identity/Core/src/SignInManager.cs

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Text;
88
using Microsoft.AspNetCore.Authentication;
99
using Microsoft.AspNetCore.Http;
10+
using Microsoft.Extensions.DependencyInjection;
1011
using Microsoft.Extensions.Logging;
1112
using Microsoft.Extensions.Options;
1213

@@ -60,32 +61,7 @@ public SignInManager(UserManager<TUser> userManager,
6061
Logger = logger;
6162
_schemes = schemes;
6263
_confirmation = confirmation;
63-
}
64-
65-
/// <summary>
66-
/// Creates a new instance of <see cref="SignInManager{TUser}"/>.
67-
/// </summary>
68-
/// <param name="userManager">An instance of <see cref="UserManager"/> used to retrieve users from and persist users.</param>
69-
/// <param name="contextAccessor">The accessor used to access the <see cref="HttpContext"/>.</param>
70-
/// <param name="claimsFactory">The factory to use to create claims principals for a user.</param>
71-
/// <param name="optionsAccessor">The accessor used to access the <see cref="IdentityOptions"/>.</param>
72-
/// <param name="logger">The logger used to log messages, warnings and errors.</param>
73-
/// <param name="schemes">The scheme provider that is used enumerate the authentication schemes.</param>
74-
/// <param name="confirmation">The <see cref="IUserConfirmation{TUser}"/> used check whether a user account is confirmed.</param>
75-
/// <param name="passkeyHandler">The <see cref="IPasskeyHandler{TUser}"/> used when performing passkey attestation and assertion.</param>
76-
public SignInManager(UserManager<TUser> userManager,
77-
IHttpContextAccessor contextAccessor,
78-
IUserClaimsPrincipalFactory<TUser> claimsFactory,
79-
IOptions<IdentityOptions> optionsAccessor,
80-
ILogger<SignInManager<TUser>> logger,
81-
IAuthenticationSchemeProvider schemes,
82-
IUserConfirmation<TUser> confirmation,
83-
IPasskeyHandler<TUser> passkeyHandler)
84-
: this(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes, confirmation)
85-
{
86-
ArgumentNullException.ThrowIfNull(passkeyHandler);
87-
88-
_passkeyHandler = passkeyHandler;
64+
_passkeyHandler = userManager.ServiceProvider?.GetService<IPasskeyHandler<TUser>>();
8965
}
9066

9167
/// <summary>

src/Identity/Extensions.Core/src/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Microsoft.AspNetCore.Identity.IUserPasskeyStore<TUser>.GetPasskeysAsync(TUser! u
77
Microsoft.AspNetCore.Identity.IUserPasskeyStore<TUser>.RemovePasskeyAsync(TUser! user, byte[]! credentialId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
88
Microsoft.AspNetCore.Identity.IUserPasskeyStore<TUser>.SetPasskeyAsync(TUser! user, Microsoft.AspNetCore.Identity.UserPasskeyInfo! passkey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
99
Microsoft.AspNetCore.Identity.UserLoginInfo.UserLoginInfo(string! loginProvider, string! providerKey, string? providerDisplayName) -> void
10+
Microsoft.AspNetCore.Identity.UserManager<TUser>.ServiceProvider.get -> System.IServiceProvider!
1011
Microsoft.AspNetCore.Identity.UserPasskeyInfo
1112
Microsoft.AspNetCore.Identity.UserPasskeyInfo.AttestationObject.get -> byte[]!
1213
Microsoft.AspNetCore.Identity.UserPasskeyInfo.ClientDataJson.get -> byte[]!

src/Identity/Extensions.Core/src/UserManager.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ public class UserManager<TUser> : IDisposable where TUser : class
4747
#if NETSTANDARD2_0 || NETFRAMEWORK
4848
private static readonly RandomNumberGenerator _rng = RandomNumberGenerator.Create();
4949
#endif
50-
private readonly IServiceProvider _services;
5150

5251
/// <summary>
5352
/// The cancellation token used to cancel operations.
@@ -83,6 +82,7 @@ public UserManager(IUserStore<TUser> store,
8382
KeyNormalizer = keyNormalizer;
8483
ErrorDescriber = errors;
8584
Logger = logger;
85+
ServiceProvider = services;
8686

8787
if (userValidators != null)
8888
{
@@ -99,7 +99,6 @@ public UserManager(IUserStore<TUser> store,
9999
}
100100
}
101101

102-
_services = services;
103102
if (services != null)
104103
{
105104
foreach (var providerName in Options.Tokens.ProviderMap.Keys)
@@ -176,6 +175,11 @@ public UserManager(IUserStore<TUser> store,
176175
/// </summary>
177176
public IdentityOptions Options { get; set; }
178177

178+
/// <summary>
179+
/// The <see cref="IServiceProvider"/> used to resolve Identity services.
180+
/// </summary>
181+
public IServiceProvider ServiceProvider { get; }
182+
179183
/// <summary>
180184
/// Gets a flag indicating whether the backing user store supports authentication tokens.
181185
/// </summary>
@@ -555,8 +559,8 @@ public virtual Task<IdentityResult> DeleteAsync(TUser user)
555559
// Need to potentially check all keys
556560
if (user == null && Options.Stores.ProtectPersonalData)
557561
{
558-
var keyRing = _services.GetService<ILookupProtectorKeyRing>();
559-
var protector = _services.GetService<ILookupProtector>();
562+
var keyRing = ServiceProvider.GetService<ILookupProtectorKeyRing>();
563+
var protector = ServiceProvider.GetService<ILookupProtector>();
560564
if (keyRing != null && protector != null)
561565
{
562566
foreach (var key in keyRing.GetAllKeyIds())
@@ -620,8 +624,8 @@ public virtual async Task<IdentityResult> CreateAsync(TUser user, string passwor
620624
{
621625
if (Options.Stores.ProtectPersonalData)
622626
{
623-
var keyRing = _services.GetRequiredService<ILookupProtectorKeyRing>();
624-
var protector = _services.GetRequiredService<ILookupProtector>();
627+
var keyRing = ServiceProvider.GetRequiredService<ILookupProtectorKeyRing>();
628+
var protector = ServiceProvider.GetRequiredService<ILookupProtector>();
625629
return protector.Protect(keyRing.CurrentKeyId, data);
626630
}
627631
return data;
@@ -1310,8 +1314,8 @@ public virtual async Task<IdentityResult> SetEmailAsync(TUser user, string? emai
13101314
// Need to potentially check all keys
13111315
if (user == null && Options.Stores.ProtectPersonalData)
13121316
{
1313-
var keyRing = _services.GetService<ILookupProtectorKeyRing>();
1314-
var protector = _services.GetService<ILookupProtector>();
1317+
var keyRing = ServiceProvider.GetService<ILookupProtectorKeyRing>();
1318+
var protector = ServiceProvider.GetService<ILookupProtector>();
13151319
if (keyRing != null && protector != null)
13161320
{
13171321
foreach (var key in keyRing.GetAllKeyIds())

src/Identity/test/Identity.Test/SignInManagerTest.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ public async Task CheckPasswordSignInReturnsLockedOutWhenLockedOut()
9090
manager.Verify();
9191
}
9292

93-
private static Mock<UserManager<PocoUser>> SetupUserManager(PocoUser user)
93+
private static Mock<UserManager<PocoUser>> SetupUserManager(PocoUser user, IServiceProvider services = null)
9494
{
95-
var manager = MockHelpers.MockUserManager<PocoUser>();
95+
var manager = MockHelpers.MockUserManager<PocoUser>(services);
9696
manager.Setup(m => m.FindByNameAsync(user.UserName)).ReturnsAsync(user);
9797
manager.Setup(m => m.FindByIdAsync(user.Id)).ReturnsAsync(user);
9898
manager.Setup(m => m.GetUserIdAsync(user)).ReturnsAsync(user.Id.ToString());
@@ -105,8 +105,7 @@ private static SignInManager<PocoUser> SetupSignInManager(
105105
HttpContext context,
106106
ILogger logger = null,
107107
IdentityOptions identityOptions = null,
108-
IAuthenticationSchemeProvider schemeProvider = null,
109-
IPasskeyHandler<PocoUser> passkeyHandler = null)
108+
IAuthenticationSchemeProvider schemeProvider = null)
110109
{
111110
var contextAccessor = new Mock<IHttpContextAccessor>();
112111
contextAccessor.Setup(a => a.HttpContext).Returns(context);
@@ -116,16 +115,14 @@ private static SignInManager<PocoUser> SetupSignInManager(
116115
options.Setup(a => a.Value).Returns(identityOptions);
117116
var claimsFactory = new UserClaimsPrincipalFactory<PocoUser, PocoRole>(manager, roleManager.Object, options.Object);
118117
schemeProvider = schemeProvider ?? new MockSchemeProvider();
119-
passkeyHandler = passkeyHandler ?? Mock.Of<IPasskeyHandler<PocoUser>>();
120118
var sm = new SignInManager<PocoUser>(
121119
manager,
122120
contextAccessor.Object,
123121
claimsFactory,
124122
options.Object,
125123
null,
126124
schemeProvider,
127-
new DefaultUserConfirmation<PocoUser>(),
128-
passkeyHandler);
125+
new DefaultUserConfirmation<PocoUser>());
129126
sm.Logger = logger ?? NullLogger<SignInManager<PocoUser>>.Instance;
130127
return sm;
131128
}
@@ -376,7 +373,10 @@ public async Task CanPasskeySignIn()
376373
passkeyHandler
377374
.Setup(h => h.PerformAssertionAsync(It.IsAny<PasskeyAssertionContext>()))
378375
.Returns(Task.FromResult(assertionResult));
379-
var manager = SetupUserManager(user);
376+
var serviceProvider = new ServiceCollection()
377+
.AddSingleton(passkeyHandler.Object)
378+
.BuildServiceProvider();
379+
var manager = SetupUserManager(user, serviceProvider);
380380
manager
381381
.Setup(m => m.SetPasskeyAsync(user, passkey))
382382
.Returns(Task.FromResult(IdentityResult.Success))
@@ -385,7 +385,7 @@ public async Task CanPasskeySignIn()
385385
var auth = MockAuth(context);
386386
SetupSignIn(context, auth, user.Id, isPersistent: false, loginProvider: null);
387387
SetupPasskeyAuth(context, auth);
388-
var helper = SetupSignInManager(manager.Object, context, passkeyHandler: passkeyHandler.Object);
388+
var helper = SetupSignInManager(manager.Object, context);
389389

390390
// Act
391391
var optionsJson = await helper.MakePasskeyRequestOptionsAsync(user);

src/Identity/test/Shared/MockHelpers.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ public static class MockHelpers
1212
{
1313
public static StringBuilder LogMessage = new StringBuilder();
1414

15-
public static Mock<UserManager<TUser>> MockUserManager<TUser>() where TUser : class
15+
public static Mock<UserManager<TUser>> MockUserManager<TUser>(IServiceProvider services = null) where TUser : class
1616
{
1717
var store = new Mock<IUserStore<TUser>>();
18-
var mgr = new Mock<UserManager<TUser>>(store.Object, null, null, null, null, null, null, null, null);
18+
var mgr = new Mock<UserManager<TUser>>(store.Object, null, null, null, null, null, null, services, null);
1919
mgr.Object.UserValidators.Add(new UserValidator<TUser>());
2020
mgr.Object.PasswordValidators.Add(new PasswordValidator<TUser>());
2121
return mgr;

0 commit comments

Comments
 (0)