diff --git a/src/Core/MailTemplates/Handlebars/Auth/FailedLoginAttempts.html.hbs b/src/Core/MailTemplates/Handlebars/Auth/FailedLoginAttempts.html.hbs
deleted file mode 100644
index 43531ef242..0000000000
--- a/src/Core/MailTemplates/Handlebars/Auth/FailedLoginAttempts.html.hbs
+++ /dev/null
@@ -1,31 +0,0 @@
-{{#>FullHtmlLayout}}
-
-
-
- Additional security has been placed on your Bitwarden account.
- |
-
-
-
- We've detected several failed attempts to log into your Bitwarden account. Future login attempts for your account will be protected by a captcha.
- |
-
-
-
- Account: {{AffectedEmail}}
- Date: {{TheDate}} at {{TheTime}} {{TimeZone}}
- IP Address: {{IpAddress}}
- |
-
-
-
- If this was you, you can remove the captcha requirement by successfully logging in.
- |
-
-
-
- If this was not you, don't worry. The login attempt was not successful and your account has been given additional protection.
- |
-
-
-{{/FullHtmlLayout}}
diff --git a/src/Core/MailTemplates/Handlebars/Auth/FailedLoginAttempts.text.hbs b/src/Core/MailTemplates/Handlebars/Auth/FailedLoginAttempts.text.hbs
deleted file mode 100644
index 3393210e4e..0000000000
--- a/src/Core/MailTemplates/Handlebars/Auth/FailedLoginAttempts.text.hbs
+++ /dev/null
@@ -1,13 +0,0 @@
-{{#>BasicTextLayout}}
-Additional security has been placed on your Bitwarden account.
-
-We've detected several failed attempts to log into your Bitwarden account. Future login attempts for your account will be protected by a captcha.
-
-Account: {{AffectedEmail}}
-Date: {{TheDate}} at {{TheTime}} {{TimeZone}}
-IP Address: {{IpAddress}}
-
-If this was you, you can remove the captcha requirement by successfully logging in.
-
-If this was not you, don't worry. The login attempt was not successful and your account has been given additional protection.
-{{/BasicTextLayout}}
\ No newline at end of file
diff --git a/src/Core/MailTemplates/Handlebars/Auth/FailedTwoFactorAttempts.html.hbs b/src/Core/MailTemplates/Handlebars/Auth/FailedTwoFactorAttempts.html.hbs
deleted file mode 100644
index d73775f8e8..0000000000
--- a/src/Core/MailTemplates/Handlebars/Auth/FailedTwoFactorAttempts.html.hbs
+++ /dev/null
@@ -1,31 +0,0 @@
-{{#>FullHtmlLayout}}
-
-
-
- Additional security has been placed on your Bitwarden account.
- |
-
-
-
- We've detected several failed attempts to log into your Bitwarden account. Future login attempts for your account will be protected by a captcha.
- |
-
-
-
- Account: {{AffectedEmail}}
- Date: {{TheDate}} at {{TheTime}} {{TimeZone}}
- IP Address: {{IpAddress}}
- |
-
-
-
- If this was you, you can remove the captcha requirement by successfully logging in. If you're having trouble with two step login, you can login using a recovery code.
- |
-
-
-
- If this was not you, you should change your master password immediately. You can view our tips for selecting a secure master password here.
- |
-
-
-{{/FullHtmlLayout}}
diff --git a/src/Core/MailTemplates/Handlebars/Auth/FailedTwoFactorAttempts.text.hbs b/src/Core/MailTemplates/Handlebars/Auth/FailedTwoFactorAttempts.text.hbs
deleted file mode 100644
index e742d35578..0000000000
--- a/src/Core/MailTemplates/Handlebars/Auth/FailedTwoFactorAttempts.text.hbs
+++ /dev/null
@@ -1,13 +0,0 @@
-{{#>BasicTextLayout}}
-Additional security has been placed on your Bitwarden account.
-
-We've detected several failed attempts to log into your Bitwarden account. Future login attempts for your account will be protected by a captcha.
-
-Account: {{AffectedEmail}}
-Date: {{TheDate}} at {{TheTime}} {{TimeZone}}
-IP Address: {{IpAddress}}
-
-If this was you, you can remove the captcha requirement by successfully logging in. If you're having trouble with two step login, you can login using a recovery code (https://bitwarden.com/help/two-step-recovery-code/).
-
-If this was not you, you should change your master password (https://bitwarden.com/help/master-password/#change-master-password) immediately. You can view our tips for selecting a secure master password here (https://bitwarden.com/blog/picking-the-right-password-for-your-password-manager/).
-{{/BasicTextLayout}}
\ No newline at end of file
diff --git a/src/Core/Services/IMailService.cs b/src/Core/Services/IMailService.cs
index 9b05810eaa..6bbfd35fdb 100644
--- a/src/Core/Services/IMailService.cs
+++ b/src/Core/Services/IMailService.cs
@@ -87,8 +87,6 @@ public interface IMailService
Task SendFamiliesForEnterpriseRedeemedEmailsAsync(string familyUserEmail, string sponsorEmail);
Task SendFamiliesForEnterpriseSponsorshipRevertingEmailAsync(string email, DateTime expirationDate);
Task SendOTPEmailAsync(string email, string token);
- Task SendFailedLoginAttemptsEmailAsync(string email, DateTime utcNow, string ip);
- Task SendFailedTwoFactorAttemptsEmailAsync(string email, DateTime utcNow, string ip);
Task SendUnverifiedOrganizationDomainEmailAsync(IEnumerable adminEmails, string organizationId, string domainName);
Task SendUnclaimedOrganizationDomainEmailAsync(IEnumerable adminEmails, string organizationId, string domainName);
Task SendSecretsManagerMaxSeatLimitReachedEmailAsync(Organization organization, int maxSeatCount, IEnumerable ownerEmails);
diff --git a/src/Core/Services/Implementations/HandlebarsMailService.cs b/src/Core/Services/Implementations/HandlebarsMailService.cs
index 1fca85eff4..afe61c5d6d 100644
--- a/src/Core/Services/Implementations/HandlebarsMailService.cs
+++ b/src/Core/Services/Implementations/HandlebarsMailService.cs
@@ -1135,40 +1135,6 @@ public class HandlebarsMailService : IMailService
await _mailDeliveryService.SendEmailAsync(message);
}
- public async Task SendFailedLoginAttemptsEmailAsync(string email, DateTime utcNow, string ip)
- {
- var message = CreateDefaultMessage("Failed login attempts detected", email);
- var model = new FailedAuthAttemptsModel()
- {
- TheDate = utcNow.ToLongDateString(),
- TheTime = utcNow.ToShortTimeString(),
- TimeZone = _utcTimeZoneDisplay,
- IpAddress = ip,
- AffectedEmail = email
-
- };
- await AddMessageContentAsync(message, "Auth.FailedLoginAttempts", model);
- message.Category = "FailedLoginAttempts";
- await _mailDeliveryService.SendEmailAsync(message);
- }
-
- public async Task SendFailedTwoFactorAttemptsEmailAsync(string email, DateTime utcNow, string ip)
- {
- var message = CreateDefaultMessage("Failed login attempts detected", email);
- var model = new FailedAuthAttemptsModel()
- {
- TheDate = utcNow.ToLongDateString(),
- TheTime = utcNow.ToShortTimeString(),
- TimeZone = _utcTimeZoneDisplay,
- IpAddress = ip,
- AffectedEmail = email
-
- };
- await AddMessageContentAsync(message, "Auth.FailedTwoFactorAttempts", model);
- message.Category = "FailedTwoFactorAttempts";
- await _mailDeliveryService.SendEmailAsync(message);
- }
-
public async Task SendUnverifiedOrganizationDomainEmailAsync(IEnumerable adminEmails, string organizationId, string domainName)
{
var message = CreateDefaultMessage("Domain not verified", adminEmails);
diff --git a/src/Core/Services/NoopImplementations/NoopMailService.cs b/src/Core/Services/NoopImplementations/NoopMailService.cs
index cd5c1af8a8..c30cdcddf7 100644
--- a/src/Core/Services/NoopImplementations/NoopMailService.cs
+++ b/src/Core/Services/NoopImplementations/NoopMailService.cs
@@ -267,16 +267,6 @@ public class NoopMailService : IMailService
return Task.FromResult(0);
}
- public Task SendFailedLoginAttemptsEmailAsync(string email, DateTime utcNow, string ip)
- {
- return Task.FromResult(0);
- }
-
- public Task SendFailedTwoFactorAttemptsEmailAsync(string email, DateTime utcNow, string ip)
- {
- return Task.FromResult(0);
- }
-
public Task SendUnverifiedOrganizationDomainEmailAsync(IEnumerable adminEmails, string organizationId, string domainName)
{
return Task.FromResult(0);
diff --git a/src/Identity/IdentityServer/RequestValidators/BaseRequestValidator.cs b/src/Identity/IdentityServer/RequestValidators/BaseRequestValidator.cs
index 5c9249ec6f..897573ba1a 100644
--- a/src/Identity/IdentityServer/RequestValidators/BaseRequestValidator.cs
+++ b/src/Identity/IdentityServer/RequestValidators/BaseRequestValidator.cs
@@ -372,32 +372,6 @@ public abstract class BaseRequestValidator where T : class
user.FailedLoginCount = ++user.FailedLoginCount;
user.LastFailedLoginDate = user.RevisionDate = utcNow;
await _userRepository.ReplaceAsync(user);
-
- if (ValidateFailedAuthEmailConditions(unknownDevice, user))
- {
- if (twoFactorInvalid)
- {
- await _mailService.SendFailedTwoFactorAttemptsEmailAsync(user.Email, utcNow, CurrentContext.IpAddress);
- }
- else
- {
- await _mailService.SendFailedLoginAttemptsEmailAsync(user.Email, utcNow, CurrentContext.IpAddress);
- }
- }
- }
-
- ///
- /// checks to see if a user is trying to log into a new device
- /// and has reached the maximum number of failed login attempts.
- ///
- /// boolean
- /// current user
- ///
- private bool ValidateFailedAuthEmailConditions(bool unknownDevice, User user)
- {
- var failedLoginCeiling = _globalSettings.Captcha.MaximumFailedLoginAttempts;
- var failedLoginCount = user?.FailedLoginCount ?? 0;
- return unknownDevice && failedLoginCeiling > 0 && failedLoginCount == failedLoginCeiling;
}
private async Task GetMasterPasswordPolicyAsync(User user)
diff --git a/test/Core.Test/Auth/Models/Business/Tokenables/SsoTokenableTests.cs b/test/Core.Test/Auth/Models/Business/Tokenables/SsoTokenableTests.cs
index 44f222c893..ab393203ab 100644
--- a/test/Core.Test/Auth/Models/Business/Tokenables/SsoTokenableTests.cs
+++ b/test/Core.Test/Auth/Models/Business/Tokenables/SsoTokenableTests.cs
@@ -1,5 +1,4 @@
-using Amazon.Runtime.Credentials.Internal;
-using AutoFixture.Xunit2;
+using AutoFixture.Xunit2;
using Bit.Core.AdminConsole.Entities;
using Bit.Core.Auth.Models.Business.Tokenables;
using Bit.Core.Tokens;
diff --git a/test/Identity.Test/IdentityServer/BaseRequestValidatorTests.cs b/test/Identity.Test/IdentityServer/BaseRequestValidatorTests.cs
index 8bbb377d2d..62849ce63b 100644
--- a/test/Identity.Test/IdentityServer/BaseRequestValidatorTests.cs
+++ b/test/Identity.Test/IdentityServer/BaseRequestValidatorTests.cs
@@ -106,43 +106,6 @@ public class BaseRequestValidatorTests
Assert.Equal("Username or password is incorrect. Try again.", errorResponse.Message);
}
- /* Logic path
- * ValidateAsync -> UpdateFailedAuthDetailsAsync -> _mailService.SendFailedLoginAttemptsEmailAsync
- * |-> BuildErrorResultAsync -> _eventService.LogUserEventAsync
- * |-> SetErrorResult
- */
- [Theory, BitAutoData]
- public async Task ValidateAsync_ContextNotValid_MaxAttemptLogin_ShouldSendEmail(
- [AuthFixtures.ValidatedTokenRequest] ValidatedTokenRequest tokenRequest,
- CustomValidatorRequestContext requestContext,
- GrantValidationResult grantResult)
- {
- // Arrange
- var context = CreateContext(tokenRequest, requestContext, grantResult);
-
- // This needs to be n-1 of the max failed login attempts
- context.CustomValidatorRequestContext.User.FailedLoginCount = 2;
- context.CustomValidatorRequestContext.KnownDevice = false;
-
- _globalSettings.Captcha.Returns(
- new GlobalSettings.CaptchaSettings
- {
- MaximumFailedLoginAttempts = 3
- });
- _sut.isValid = false;
-
- // Act
- await _sut.ValidateAsync(context);
-
- // Assert
- await _mailService.Received(1)
- .SendFailedLoginAttemptsEmailAsync(
- Arg.Any(), Arg.Any(), Arg.Any());
- Assert.True(context.GrantResult.IsError);
- var errorResponse = (ErrorResponseModel)context.GrantResult.CustomResponse["ErrorModel"];
- Assert.Equal("Username or password is incorrect. Try again.", errorResponse.Message);
- }
-
[Theory, BitAutoData]
public async Task ValidateAsync_DeviceNotValidated_ShouldLogError(
[AuthFixtures.ValidatedTokenRequest] ValidatedTokenRequest tokenRequest,
diff --git a/test/IntegrationTestCommon/Factories/WebApplicationFactoryBase.cs b/test/IntegrationTestCommon/Factories/WebApplicationFactoryBase.cs
index 78cd1731ae..c5f2cfa01e 100644
--- a/test/IntegrationTestCommon/Factories/WebApplicationFactoryBase.cs
+++ b/test/IntegrationTestCommon/Factories/WebApplicationFactoryBase.cs
@@ -1,5 +1,4 @@
using AspNetCoreRateLimit;
-using Bit.Core.Auth.Services;
using Bit.Core.Billing.Services;
using Bit.Core.Platform.Push;
using Bit.Core.Platform.Push.Internal;