Их найдено более одного решения, и я решил расширить 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);