我使用微软提出的方式为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。 如何访问用户数据以判断其帐户是否由管理员确认?
答案 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>();
}