В наших конфигурационных файлах есть строки подключения, которые не содержат паролей.
Data Source=OurDataSource;Initial Catalog=OurCatalog;Integrated Security=False;UID=OurUser;Encrypt=True;TrustServerCertificate=False;
В нашем коде пароль загружается из сервиса и добавляется следующим образом:
var connectionString = ConfigurationManager.ConnectionStrings["ourCS"].ConnectionString;
var builder = new SqlConnectionStringBuilder(connectionString);
var credential = GetPassword(builder.UserID);
builder.Password = credential.Password;
var connectionString = builder.ConnectionString;
using (var db = new SqlConnection(connectionString))
{
// Execute our query
}
Служба паролей меняет пароль каждые несколько месяцев, и недавно после смены пароля мы начали получать сообщения об ошибках входа в систему ниже и учетная запись заблокирована.
Login failed for user 'OurUser'. Reason: Password did not match that for the login provided.
Мое исследование указывает на проблемы с пулом соединений, у которого все еще есть открытые соединения, которые пытаются аутентифицироваться на базе данных и блокировать ее.
Вся наша связь с БД осуществляется с использованием приведенных выше операторов, которые должны закрывать соединение при вызове dispose. Однако после декомпиляции System.Data.SqlClient.SqlConnection кажется, что метод dispose не закрывает соединение.
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
// using CloseHandle and UnmapViewOfFile - no exposure
[ResourceExposure(ResourceScope.None)]
[ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)]
private void Dispose(bool disposing) {
if (disposing) {
// Nothing to do here
;
}
if (pMemMap != IntPtr.Zero) {
NativeMethods.UnmapViewOfFile(pMemMap);
pMemMap = IntPtr.Zero;
}
if (hMemMap != IntPtr.Zero) {
NativeMethods.CloseHandle(hMemMap);
hMemMap = IntPtr.Zero;
}
active = false;
}
~SqlDebugContext() {
Dispose(false);
}
Кто-нибудь сталкивался с этой проблемой и ее решением? На данный момент он указывает на необходимость вызова соединения следующим образом, поскольку не похоже, что это делает Dispose.
using (var db = new SqlConnection(connectionString))
{
// Execute our query
db.Close();
}