Переопределить PasswordSignInAsync в пользовательском SignInManager (ASP.NET Core 2) - PullRequest
0 голосов
/ 31 августа 2018

Забавная вещь случилась со мной. Так смешно, я все еще неуправляем.

Рассказ: Вдохновленный https://www.stevejgordon.co.uk/extending-the-asp-net-core-identity-signinmanager Я создал пользовательский SignInManager с переопределением метода PasswordSignInAsync. Предпосылкой этого требования является наличие второй страницы входа (с ПИН-кодом). Тем не менее, когда я пытаюсь войти с новой страницы (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);
}
}

Если честно, это уже не смешно. Может ли кто-нибудь указать мне правильное направление?

Большое спасибо заранее.

* Н. +1028 *

1 Ответ

0 голосов
/ 05 февраля 2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...