egmfrs
egmfrs

Reputation: 1360

How to Extend SignInManager in .net Core 2.0

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: enter image description here What am I doing wrong?

Upvotes: 5

Views: 5351

Answers (2)

Angelo
Angelo

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

egmfrs
egmfrs

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

Related Questions