Asp. Net Core - Identity SignInManager - Как выполнить вход с дополнительными условиями для входа пользователей (например: ClientId, UserName и Password)) - PullRequest
0 голосов
/ 13 апреля 2020

Как выполнить вход с дополнительным условием , в Asp. Net Core - Identity SignInManager

Пример. Я хочу проверить и подтвердить ClientId , Имя пользователя и Пароль для входа.

что-то вроде этого

var result = await SignInManager.PasswordSignInAsync(model.ClientId, model.Email, model.Password, model.RememberMe, shouldLockout: false);

Пожалуйста, смотрите полный код ниже

        public async Task<IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");

            if (ModelState.IsValid)
            {
                // This doesn't count login failures towards account lockout
                // To enable password failures to trigger account lockout, set lockoutOnFailure: true
                var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);

                if (result.Succeeded)
                {
                    _logger.LogInformation("User logged in.");
                    return LocalRedirect(returnUrl);
                }
                if (result.RequiresTwoFactor)
                {
                    return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
                }
                if (result.IsLockedOut)
                {
                    _logger.LogWarning("User account locked out.");
                    return RedirectToPage("./Lockout");
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "Invalid login attempt.");
                    return Page();
                }
            }

            // If we got this far, something failed, redisplay form
            return Page();
        }```

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Их найдено более одного решения, и я решил расширить signInManager.
Приведенный выше ответ @Markuzy также верен, { ссылка }

Вот мой код

public class MySignInManager<TUser> : SignInManager<MyUser> where TUser : class
{
    private readonly UserManager<MyUser> _userManager;
    private readonly MyContext _dbContext;
    private readonly IHttpContextAccessor _contextAccessor;

    public MySignInManager(UserManager<MyUser> userManager, IHttpContextAccessor contextAccessor, IUserClaimsPrincipalFactory<MyUser> claimsFactory, IOptions<IdentityOptions> optionsAccessor, ILogger<SignInManager<MyUser>> logger, MyContext dbContext, IAuthenticationSchemeProvider schemeProvider, IUserConfirmation<MyUser> confirmation) : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemeProvider, confirmation)
    {
        _userManager = userManager ?? throw new ArgumentNullException(nameof(userManager));
        _contextAccessor = contextAccessor ?? throw new ArgumentNullException(nameof(contextAccessor));
        _dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
    }

    public override async Task<SignInResult> PasswordSignInAsync(string userName, string password, bool isPersistent, bool lockoutOnFailure)
    {
        SignInResult signInResult = new SignInResult();

        //Login not allowed - ClientId required to login
        return await Task.FromResult(signInResult);
    }

    public async Task<SignInResult> PasswordSignInAsync(string clientId, string userName, string password, bool isPersistent, bool lockoutOnFailure)
    {      
        if(CheckIsClientIdValid(username, password))
        {
            var result = await base.PasswordSignInAsync(userName, password, isPersistent, lockoutOnFailure);
            return result;
        }
        else
        {
            SignInResult result = await Task.FromResult(new SignInResult());
            //Login not allowed - ClientId mismatch
            return result;
        }            
    }
}

и добавить нижеприведенный код в Startup.cs в соответствии с порядком

services.AddSignInManager<MySignInManager<MyUser>>();

и использовать как

var result = await _signInManager.PasswordSignInAsync(Input.ClientId, Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
0 голосов
/ 14 апреля 2020

Я рекомендую использовать шаблон адаптера , написав интерфейс и класс оболочки, который реализует интерфейс поверх оригинального SignInManager.PasswordSignInAsyn c.

Этот класс оболочки будет иметь метод, который принимает идентификатор клиента вместе с остальными параметрами, выполняет проверку, а затем вызывает SignInManager.PasswordSignInAsyn c после завершения.

Ваш метод входа в систему будет вызывать класс-оболочку через интерфейс, используя. Внедрение зависимостей netCore через startup.cs.

public interface ISignInManagerAdapter
{
    Task<Microsoft.AspNetCore.Identity.SignInResult>  PasswordWithClientIdSignInAsync(string clientId, string userName, string password, bool isPersistent, bool lockoutOnFailure);
}

public class SignInManagerAdapter
{ 
    private readonly IClientValidatorService _clientValidatorService;
    public SignInManagerAdapter(IClientValidatorService clientValidatorService)
    {
       //you can add dependency injection interfaces to constructor parameter like below example.
       this._clientValidatorService = clientValidatorService;
    }
    public async Task<Microsoft.AspNetCore.Identity.SignInResult>  PasswordWithClientIdSignInAsync(string clientId, string userName, string password, bool isPersistent, bool lockoutOnFailure)
    {
        var validationStatus = _clientValidatorService.ValidateClientId(clientId);
        if (validationStatus == "Active")
        {
           var result = await SignInManager.PasswordSignInAsync(model.ClientId, model.Email, model.Password, model.RememberMe, shouldLockout: false);
           //do something
        }
        else
        {
           //do something
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...