如何在PasswordSignInAsync之前检查AspNetUser是否满足条件?

Pio*_*rek 3 asp.net entity-framework asp.net-identity asp.net-identity-3 asp.net-core

我使用Microsoft提出的方法为AspNetUsers添加了一个新列:

public class ApplicationUser : IdentityUser
{
    public bool AdminConfirmed { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这意味着管理员必须在注册后确认用户帐户.

登录的默认方式是:

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
     _logger.LogInformation(1, "User logged in.");
     return RedirectToLocal(returnUrl);
}
Run Code Online (Sandbox Code Playgroud)

但正如我所见,我没有任何可能编辑"PasswordSignInAsync"背后的代码.那么如何添加另一个条件会导致此方法返回result.IsNotAllowed如果用户的帐户未被admin确认?

我也不知道如何从数据库中获取有关用户的一些数据.我存储授权数据的DbContext如下所示:

public class AuthorizationDbContext : IdentityDbContext<ApplicationUser>
    {
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
        }
    }
Run Code Online (Sandbox Code Playgroud)

通常我会用:

public DbSet<SomeModel> SomeData { get; set; }
Run Code Online (Sandbox Code Playgroud)

访问一些数据.但是对于VisualStudio为我生成的AspNetUsers表,我没有任何"c#类模型"可以放入DbSet.然后我如何访问用户数据以告知他的帐户是否由管理员确认?

tmg*_*tmg 6

你可以覆盖CanSignInAsync(TUser user)方法SignInManager

public class ApplicationSignInManager: SignInManager<User>
{
   public ApplicationSignInManager(UserManager<User> userManager, IHttpContextAccessor contextAccessor,
            IUserClaimsPrincipalFactory<User> claimsFactory, IOptions<IdentityOptions> optionsAccessor,
            ILogger<SignInManager<User>> logger)
            : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger){}

   public override Task<bool> CanSignInAsync(User user)
   {
       if (!user.AdminConfirmed)
           return false;

       return base.CanSignInAsync(user);
   }           
}
Run Code Online (Sandbox Code Playgroud)

您还需要将ApplicationSignInManageras服务添加到服务容器,以通过依赖注入使其在您的应用程序中可用.

public void ConfigureServices(IServiceCollection services)
{
       ...    
       services.AddIdentity...
       services.AddScoped<ApplicationSignInManager>();    
}
Run Code Online (Sandbox Code Playgroud)