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.然后我如何访问用户数据以告知他的帐户是否由管理员确认?
你可以覆盖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)
| 归档时间: |
|
| 查看次数: |
764 次 |
| 最近记录: |