gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:35:50 25 4
gpt4 key购买 nike

我已经使用 Microsoft 提议的方式向 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”背后的代码。 那么,如果管理员未确认用户帐户,我该如何添加另一个条件来使此方法返回 result.IsNotAllowed?

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

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

通常我会使用:

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

访问一些数据。但是对于 VisualStudio 为我生成的 AspNetUsers 表,我没有任何“c# 类模型”可以放入 DbSet。 然后我如何访问用户数据以判断他的帐户是否已被管理员确认?

最佳答案

您可以覆盖 SignInManagerCanSignInAsync(TUser user) 方法

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 作为服务添加到服务容器中,以通过依赖注入(inject)使其在您的应用程序中可用。

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

关于asp.net - 如何在 PasswordSignInAsync 之前检查 AspNetUser 是否满足条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35484413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com