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

时间:2016-02-18 14:38:38

标签: asp.net entity-framework asp.net-identity asp.net-core asp.net-identity-3

我使用微软提出的方式为AspNetUsers添加了一个新专栏:

public class ApplicationUser : IdentityUser
{
    public bool AdminConfirmed { get; set; }
}

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

登录的默认方式是:

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);
}

但正如我所见,我没有任何可能编辑密码" PasswordSignInAsync"。 那么我该如何添加另一个导致此方法返回结果的条件。如果管理员未确认用户的帐户,我是否允许?

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

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

通常我会使用:

public DbSet<SomeModel> SomeData { get; set; }

访问一些数据。但是对于由VisualStudio为我生成的AspNetUsers表,我没有任何&#34; c#类模型&#34;投入DbSet。 如何访问用户数据以判断其帐户是否由管理员确认?

1 个答案:

答案 0 :(得分: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);
   }           
}

此外,您需要将ApplicationSignInManager作为服务添加到服务容器中,以便通过依赖注入使其在您的应用程序中可用。

public void ConfigureServices(IServiceCollection services)
{
       ...    
       services.AddIdentity...
       services.AddScoped<ApplicationSignInManager>();    
}
相关问题