Fix #4841: force 2FA validation when it's required in site level.

This commit is contained in:
Ben 2024-11-23 13:04:27 +08:00
parent 601caab3b6
commit b5f75f0c5e
2 changed files with 5 additions and 3 deletions

View File

@ -136,7 +136,7 @@ namespace Oqtane.Controllers
filtered.PhotoFileId = user.PhotoFileId; filtered.PhotoFileId = user.PhotoFileId;
filtered.LastLoginOn = user.LastLoginOn; filtered.LastLoginOn = user.LastLoginOn;
filtered.LastIPAddress = user.LastIPAddress; filtered.LastIPAddress = user.LastIPAddress;
filtered.TwoFactorRequired = false; filtered.TwoFactorRequired = user.TwoFactorRequired;
filtered.Roles = user.Roles; filtered.Roles = user.Roles;
filtered.CreatedBy = user.CreatedBy; filtered.CreatedBy = user.CreatedBy;
filtered.CreatedOn = user.CreatedOn; filtered.CreatedOn = user.CreatedOn;

View File

@ -339,13 +339,15 @@ namespace Oqtane.Managers
user = _users.GetUser(user.Username); user = _users.GetUser(user.Username);
if (!user.IsDeleted) if (!user.IsDeleted)
{ {
if (user.TwoFactorRequired) var alias = _tenantManager.GetAlias();
var twoFactorSetting = _settings.GetSetting(EntityNames.Site, alias.SiteId, "LoginOptions:TwoFactor")?.SettingValue ?? "false";
var twoFactorRequired = twoFactorSetting == "required" || user.TwoFactorRequired;
if (twoFactorRequired)
{ {
var token = await _identityUserManager.GenerateTwoFactorTokenAsync(identityuser, "Email"); var token = await _identityUserManager.GenerateTwoFactorTokenAsync(identityuser, "Email");
user.TwoFactorCode = token; user.TwoFactorCode = token;
user.TwoFactorExpiry = DateTime.UtcNow.AddMinutes(10); user.TwoFactorExpiry = DateTime.UtcNow.AddMinutes(10);
_users.UpdateUser(user); _users.UpdateUser(user);
var alias = _tenantManager.GetAlias();
string siteName = _sites.GetSite(alias.SiteId).Name; string siteName = _sites.GetSite(alias.SiteId).Name;
string subject = _localizer["TwoFactorEmailSubject"]; string subject = _localizer["TwoFactorEmailSubject"];
subject = subject.Replace("[SiteName]", siteName); subject = subject.Replace("[SiteName]", siteName);