一件有趣的事发生在我身上。真有趣,我仍然无法控制。
短篇小说:
受https://www.stevejgordon.co.uk/extending-the-asp-net-core-identity-signinmanager的启发,我创建了一个自定义SignInManager
并覆盖了PasswordSignInAsync
方法。这项要求的背景是拥有第二个登录页面(带有PIN)。但是,当我尝试从新页面(LoginPin.cshtml)登录时,没有找到PasswordSignInAsync
。
这是有趣的事情:当我从Login.cshtml页面执行相同操作时,它会被击中!
长话短说
public class AuditableSignInManager<TUser> : SignInManager<TUser> where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly ApplicationDbContext _db;
private readonly IHttpContextAccessor _contextAccessor;
public AuditableSignInManager(UserManager<TUser> userManager, IHttpContextAccessor contextAccessor, IUserClaimsPrincipalFactory<TUser> claimsFactory,
IOptions<IdentityOptions> optionsAccessor, ILogger<SignInManager<TUser>> logger, ApplicationDbContext dbContext, IAuthenticationSchemeProvider schemes)
: base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes)
{
_userManager = userManager ?? throw new ArgumentNullException(nameof(userManager));
_contextAccessor = contextAccessor ?? throw new ArgumentNullException(nameof(contextAccessor));
_db = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
}
public override async Task<SignInResult> PasswordSignInAsync(TUser user, string password, bool isPersistent, bool lockoutOnFailure)
{
//skipped for readability reasons
var result = await base.PasswordSignInAsync(user, password, isPersistent, lockoutOnFailure);
}
}
Startup.cs和依赖注入:
services.AddScoped<SignInManager<ApplicationUser>, AuditableSignInManager<ApplicationUser>>();
Login.cshtml.cs
public class LoginModel : PageModel
{
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly ILogger<LoginModel> _logger;
public LoginModel(SignInManager<ApplicationUser> signInManager, ILogger<LoginModel> logger)
{
_signInManager = signInManager;
_logger = logger;
}
// skipped
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
var result = await _signInManager.PasswordSignInAsync(Input.UserName, Input.Password, false, lockoutOnFailure: false);
}
}
LoginPin.cshtml.cs
public class LoginModelPin : PageModel
{
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly ILogger<LoginModelPin> _logger;
public LoginModelPin(SignInManager<ApplicationUser> signInManager, ILogger<LoginModelPin> logger)
{
_signInManager = signInManager;
_logger = logger;
}
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
var result = await _signInManager.PasswordSignInAsync(usrPwd, usrPwd, false, lockoutOnFailure: false);
}
}
说实话:这已经不再有趣了。有人可以指出我正确的方向吗?
非常感谢。
N。
答案 0 :(得分:0)
尝试使用AddSignInManager<TSignInManager>>