Reputation: 1360
I have set up a new property in my User class (IsEnabled) and want the sign in manager to check this, so I am overriding PasswordSignInAsync as follows:
public class AuthSignInManager<TUser> : SignInManager<User> where TUser : class
{
private readonly UserManager<User> _userManager;
private readonly AuthContext _db;
private readonly IHttpContextAccessor _contextAccessor;
public AuthSignInManager(
UserManager<User> userManager,
IHttpContextAccessor contextAccessor,
IUserClaimsPrincipalFactory<User> claimsFactory,
IOptions<IdentityOptions> optionsAccessor,
ILogger<SignInManager<User>> logger,
AuthContext dbContext,
IAuthenticationSchemeProvider schemeProvider
)
: base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemeProvider)
{
_userManager = userManager ?? throw new ArgumentNullException(nameof(userManager));
_contextAccessor = contextAccessor ?? throw new ArgumentNullException(nameof(contextAccessor));
_db = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
}
public override Task<SignInResult> PasswordSignInAsync(string userName, string password, bool rememberMe, bool shouldLockout)
{
var user = UserManager.FindByEmailAsync(userName).Result;
if ((user.IsEnabled.HasValue && !user.IsEnabled.Value) || !user.IsEnabled.HasValue)
{
return Task.FromResult(SignInResult.LockedOut);
}
return base.PasswordSignInAsync(userName, password, rememberMe, shouldLockout);
}
}
I have put the following in startup:
services.AddIdentity<User, IdentityRole>(config =>
{
config.SignIn.RequireConfirmedEmail = true;
})
.AddEntityFrameworkStores<AuthContext>()
.AddDefaultTokenProviders()
.AddUserManager<AuthSignInManager<User>>();
services.AddScoped<SignInManager<User>, AuthSignInManager<User>>();
But when I run my project now I get the following error:
What am I doing wrong?
Upvotes: 5
Views: 5351
Reputation: 144
perhaps also can change to:
public override async Task<SignInResult> PasswordSignInAsync(string userName, string password, bool rememberMe, bool shouldLockout)
{
var user = await UserManager.FindByEmailAsync(userName);
if ((user.IsEnabled.HasValue && !user.IsEnabled.Value) || !user.IsEnabled.HasValue)
{
return SignInResult.LockedOut;
}
return await base.PasswordSignInAsync(userName, password, rememberMe, shouldLockout);
}
Upvotes: 0
Reputation: 1360
As Brad pointed out, the startup should NOT be calling AddUserManager
Instead:
.AddSignInManager<AuthSignInManager<User>>();
The line following this can also be removed entirely as it's achieving the equivalent:
services.AddScoped<SignInManager<User>, AuthSignInManager<User>>();
Upvotes: 8