Compare commits

...
3 changed files with 13 additions and 10 deletions
@@ -79,9 +79,12 @@ namespace Streetwriters.Identity.Controllers
} }
[HttpDelete] [HttpDelete]
public IActionResult Disable2FA() public async Task<IActionResult> Disable2FA()
{ {
return BadRequest("2FA is mandatory and cannot be disabled."); var user = await UserManager.GetUserAsync(User) ?? throw new Exception("User not found.");
if (!await UserManager.GetTwoFactorEnabledAsync(user)) return Ok();
await MFAService.DisableMFAAsync(user);
return Ok();
} }
[HttpGet("codes")] [HttpGet("codes")]
@@ -34,12 +34,6 @@ namespace Streetwriters.Identity.Services
var claims = await userManager.GetClaimsAsync(user); var claims = await userManager.GetClaimsAsync(user);
var marketingConsentClaim = claims.FirstOrDefault((claim) => claim.Type == $"{clientId}:marketing_consent"); var marketingConsentClaim = claims.FirstOrDefault((claim) => claim.Type == $"{clientId}:marketing_consent");
if (await userManager.IsEmailConfirmedAsync(user) && !await userManager.GetTwoFactorEnabledAsync(user))
{
await mfaService.EnableMFAAsync(user, MFAMethods.Email);
user = await userManager.FindByIdAsync(userId);
ArgumentNullException.ThrowIfNull(user);
}
ArgumentNullException.ThrowIfNull(user.Email); ArgumentNullException.ThrowIfNull(user.Email);
return new UserModel return new UserModel
@@ -163,6 +157,7 @@ namespace Streetwriters.Identity.Services
} }
else else
{ {
await mfaService.EnableMFAAsync(user, MFAMethods.Email);
if (userAgent != null) await userManager.AddClaimAsync(user, new Claim("platform", PlatformFromUserAgent(userAgent))); if (userAgent != null) await userManager.AddClaimAsync(user, new Claim("platform", PlatformFromUserAgent(userAgent)));
var code = await userManager.GenerateEmailConfirmationTokenAsync(user); var code = await userManager.GenerateEmailConfirmationTokenAsync(user);
var callbackUrl = UrlExtensions.TokenLink(user.Id.ToString(), code, client.Id, TokenType.CONFRIM_EMAIL); var callbackUrl = UrlExtensions.TokenLink(user.Id.ToString(), code, client.Id, TokenType.CONFRIM_EMAIL);
@@ -59,7 +59,6 @@ namespace Streetwriters.Identity.Validation
public string GrantType => Config.EMAIL_GRANT_TYPE; public string GrantType => Config.EMAIL_GRANT_TYPE;
public async Task ValidateAsync(ExtensionGrantValidationContext context) public async Task ValidateAsync(ExtensionGrantValidationContext context)
{ {
var email = context.Request.Raw["email"]; var email = context.Request.Raw["email"];
@@ -76,8 +75,14 @@ namespace Streetwriters.Identity.Validation
}; };
var isMultiFactor = await UserManager.GetTwoFactorEnabledAsync(user); var isMultiFactor = await UserManager.GetTwoFactorEnabledAsync(user);
if (!isMultiFactor)
{
context.Result.IsError = false;
context.Result.Subject = await TokenGenerationService.TransformTokenRequestAsync(context.Request, user, GrantType, [Config.MFA_PASSWORD_GRANT_TYPE_SCOPE]);
return;
}
var primaryMethod = isMultiFactor ? MFAService.GetPrimaryMethod(user) : MFAMethods.Email; var primaryMethod = MFAService.GetPrimaryMethod(user);
var secondaryMethod = MFAService.GetSecondaryMethod(user); var secondaryMethod = MFAService.GetSecondaryMethod(user);
var sendPhoneNumber = primaryMethod == MFAMethods.SMS || secondaryMethod == MFAMethods.SMS; var sendPhoneNumber = primaryMethod == MFAMethods.SMS || secondaryMethod == MFAMethods.SMS;