using Microsoft.AspNetCore.Mvc; using Nop.Core; using Nop.Core.Domain.Customers; using Nop.Core.Http.Extensions; using Nop.Plugin.MultiFactorAuth.GoogleAuthenticator.Models; using Nop.Plugin.MultiFactorAuth.GoogleAuthenticator.Services; using Nop.Services.Customers; using Nop.Services.Localization; using Nop.Services.Messages; using Nop.Web.Framework.Controllers; namespace Nop.Plugin.MultiFactorAuth.GoogleAuthenticator.Controllers; [AutoValidateAntiforgeryToken] public class AuthenticationController : BasePluginController { #region Fields protected readonly CustomerSettings _customerSettings; protected readonly GoogleAuthenticatorService _googleAuthenticatorService; protected readonly ICustomerRegistrationService _customerRegistrationService; protected readonly ICustomerService _customerService; protected readonly ILocalizationService _localizationService; protected readonly INotificationService _notificationService; protected readonly IWorkContext _workContext; #endregion #region Ctor public AuthenticationController( CustomerSettings customerSettings, GoogleAuthenticatorService googleAuthenticatorService, ICustomerRegistrationService customerRegistrationService, ICustomerService customerService, ILocalizationService localizationService, INotificationService notificationService, IWorkContext workContext) { _customerSettings = customerSettings; _googleAuthenticatorService = googleAuthenticatorService; _customerRegistrationService = customerRegistrationService; _customerService = customerService; _localizationService = localizationService; _notificationService = notificationService; _workContext = workContext; } #endregion #region Methods [HttpPost] public async Task RegisterGoogleAuthenticator(AuthModel model) { var currentCustomer = await _workContext.GetCurrentCustomerAsync(); var isValidToken = _googleAuthenticatorService.ValidateTwoFactorToken(model.SecretKey, model.Code); if (isValidToken) { //try to find config with current customer and update if (_googleAuthenticatorService.IsRegisteredCustomer(currentCustomer.Email)) { await _googleAuthenticatorService.UpdateGoogleAuthenticatorAccountAsync(currentCustomer.Email, model.SecretKey); } else { await _googleAuthenticatorService.AddGoogleAuthenticatorAccountAsync(currentCustomer.Email, model.SecretKey); } _notificationService.SuccessNotification(await _localizationService.GetResourceAsync("Plugins.MultiFactorAuth.GoogleAuthenticator.Token.Successful")); } else { _notificationService.ErrorNotification(await _localizationService.GetResourceAsync("Plugins.MultiFactorAuth.GoogleAuthenticator.Token.Unsuccessful")); return RedirectToRoute("CustomerMultiFactorAuthenticationProviderConfig", new { providerSysName = GoogleAuthenticatorDefaults.SystemName }); } return RedirectToRoute("MultiFactorAuthenticationSettings"); } [HttpPost] public async Task VerifyGoogleAuthenticator(TokenModel model) { var customerMultiFactorAuthenticationInfo = await HttpContext.Session.GetAsync(NopCustomerDefaults.CustomerMultiFactorAuthenticationInfo); var username = customerMultiFactorAuthenticationInfo.UserName; var returnUrl = customerMultiFactorAuthenticationInfo.ReturnUrl; var isPersist = customerMultiFactorAuthenticationInfo.RememberMe; var customer = _customerSettings.UsernamesEnabled ? await _customerService.GetCustomerByUsernameAsync(username) : await _customerService.GetCustomerByEmailAsync(username); if (customer == null) return RedirectToRoute("Login"); var record = _googleAuthenticatorService.GetConfigurationByCustomerEmail(customer.Email); if (record != null) { var isValidToken = _googleAuthenticatorService.ValidateTwoFactorToken(record.SecretKey, model.Token); if (isValidToken) { await HttpContext.Session.SetAsync(NopCustomerDefaults.CustomerMultiFactorAuthenticationInfo, null); return await _customerRegistrationService.SignInCustomerAsync(customer, returnUrl, isPersist); } else { _notificationService.ErrorNotification(await _localizationService.GetResourceAsync("Plugins.MultiFactorAuth.GoogleAuthenticator.Token.Unsuccessful")); } } else { _notificationService.ErrorNotification(await _localizationService.GetResourceAsync("Plugins.MultiFactorAuth.GoogleAuthenticator.Record.Notfound")); } return RedirectToRoute("MultiFactorVerification"); } #endregion }