using System.Threading.Tasks; using Erp.Platform.Localization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Localization; using Microsoft.Extensions.Options; using Volo.Abp; using Volo.Abp.Account; using Volo.Abp.Account.Web.Areas.Account.Controllers.Models; using Volo.Abp.Auditing; using Volo.Abp.DependencyInjection; using Volo.Abp.Identity; using Volo.Abp.Settings; using Volo.Abp.Validation; using AccountController = Volo.Abp.Account.Web.Areas.Account.Controllers.AccountController; using IdentityUser = Volo.Abp.Identity.IdentityUser; using SignInResult = Microsoft.AspNetCore.Identity.SignInResult; using UserLoginInfo = Volo.Abp.Account.Web.Areas.Account.Controllers.Models.UserLoginInfo; namespace Erp.Platform.Identity; [Dependency(ReplaceServices = true)] [ExposeServices(typeof(AccountController))] [RemoteService(Name = AccountRemoteServiceConsts.RemoteServiceName)] public class PlatformAccountController : AccountController { #region Captcha Related Props public readonly ICaptchaManager captchaManager; private readonly IStringLocalizer LP; [BindProperty(Name = "g-recaptcha-response")] [DisableAuditing] public string CaptchaResponse { get; set; } #endregion public PlatformAccountController( SignInManager signInManager, IdentityUserManager userManager, ISettingProvider settingProvider, IdentitySecurityLogManager identitySecurityLogManager, IOptions identityOptions, IdentityDynamicClaimsPrincipalContributorCache identityDynamicClaimsPrincipalContributorCache, ICaptchaManager captchaManager, IStringLocalizer LP ) : base(signInManager, userManager, settingProvider, identitySecurityLogManager, identityOptions, identityDynamicClaimsPrincipalContributorCache) { this.captchaManager = captchaManager; this.LP = LP; } public override async Task Login(UserLoginInfo login) { await CheckLocalLoginAsync(); ValidateLoginInfo(login); var user = await ReplaceEmailAndReturnUser(login); if (user == null) { return new PlatformLoginResult(SignInResult.Failed, LP); } //Verify captcha if AccessFailedCount > maxAccessFailedCount var maxAccessFailedCount = await SettingProvider.GetAsync(PlatformConsts.AbpAccount.Captcha.MaxFailedAccessAttempts); if (user.AccessFailedCount >= maxAccessFailedCount) { var tokenVerified = await captchaManager.VerifyCaptchaAsync(CaptchaResponse); if (!tokenVerified) { return new PlatformLoginResult(PlatformLoginResultType.ShowCaptcha, LP); } } var signInResult = await SignInManager.PasswordSignInAsync( login.UserNameOrEmailAddress, login.Password, login.RememberMe, true ); await IdentitySecurityLogManager.SaveAsync(new IdentitySecurityLogContext() { Identity = IdentitySecurityLogIdentityConsts.Identity, Action = signInResult.ToIdentitySecurityLogActionK(), UserName = login.UserNameOrEmailAddress }); var result = new PlatformLoginResult(signInResult, LP); if (result.PResult != PlatformLoginResultType.Succeeded && user.AccessFailedCount >= maxAccessFailedCount) { // Display captcha result.PResult = PlatformLoginResultType.ShowCaptcha; } return result; } protected async Task ReplaceEmailAndReturnUser(UserLoginInfo login) { if (ValidationHelper.IsValidEmailAddress(login.UserNameOrEmailAddress)) { var userByEmail = await UserManager.FindByEmailAsync(login.UserNameOrEmailAddress); if (userByEmail != null) { login.UserNameOrEmailAddress = userByEmail.UserName; return userByEmail; } } else { var userByUsername = await UserManager.FindByNameAsync(login.UserNameOrEmailAddress); if (userByUsername != null) { return userByUsername; } } return null; } }