Oracle.ManagedDataAccess и ORA-01017: неверное имя пользователя / пароль; вход запрещен
У меня сложная ситуация на одном из наших серверов. У меня есть приложение ASP.NET MVC 3, которое необходимо подключиться к базе данных Oracle 12c. Для этого используется следующая строка подключения:
User ID=myuserid;Password=mypass;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<IP ADDRESS>)(PORT = 1521)))(CONNECT_DATA=(SERVICE_NAME=PDB1)));
Я также использую Oracle.ManagedDataAccess от Oracle версии 4.121.1.0. Каждая попытка подключения приводит к следующей ошибке:
ORA-01017: invalid username/password; logon denied
Я могу успешно подключиться на своем рабочем столе с указанными выше учетными данными. У меня такой же код на другом сервере, но я использую более старую неуправляемую версию библиотеки, и она может успешно соединиться с вышеупомянутыми учетными данными. Однако сервер, на котором я хотел бы, чтобы мой код запускался, каждый раз дает сбой, используя одни и те же учетные данные, которые обеспечивают успешное соединение на разных серверах.
На сервере, который выходит из строя, я могу:
- подключиться через SQLPLUS
- ударить базу данных с помощью TNSPING
- Создайте системный DSN для установления соединения ODBC
Я проверил TNSNAMES.ORA во всех местах, и они кажутся правильными.
После многократного обращения к базе данных учетная запись фактически заблокировалась, что указывало на то, что я действительно обращался к базе данных и что базе данных не понравились представленные учетные данные. Я проверил приложения, которые ранее успешно подключались, и они также потерпели неудачу с ошибкой, указывающей, что учетная запись была заблокирована. Разблокировка учетной записи привела к успешному подключению этих приложений, за исключением сервера, с которым у меня возникли проблемы.
Я в конце своего остроумия.
У кого-нибудь есть другие предложения относительно того, что может вызвать эту проблему?
РЕДАКТИРОВАТЬ:
Я установил WireShark на свой локальный компьютер и на сервер-нарушитель. Я зафиксировал связь между моим рабочим столом и базой данных, а также сервером-нарушителем и базой данных. Я обнаружил, что мой рабочий стол сообщил пароль:
0080 35 42 31 41 43 34 30 00 01 01 01 0d 0d 41 55 54 5B1AC40......AUT
0090 48 5f 50 41 53 53 57 4f 52 44 01 40 40 43 30 36 H_PASSWORD.@@C06
00a0 37 39 42 31 31 42 46 36 42 41 43 44 39 30 38 44 79B11BF6BACD908D
00b0 37 39 34 34 31 31 46 34 32 33 30 42 34 36 44 36 794411F4230B46D6
00c0 35 36 36 33 31 42 45 39 39 41 36 43 36 37 42 44 56631BE99A6C67BD
00d0 43 33 35 42 42 44 36 44 42 45 37 34 36 00 01 0d C35BBD6DBE746...
тогда как сервер, с которым у меня возникли проблемы, не сделал (или, по крайней мере, это предположение):
0080 39 33 39 37 32 33 46 00 01 01 01 0d 0d 41 55 54 939723F......AUT
0090 48 5f 50 41 53 53 57 4f 52 44 01 40 40 00 00 00 H_PASSWORD.@@...
00a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0d ................
Кто-нибудь знает настройки безопасности / конфигурации, которые предотвращают передачу паролей, даже если они присутствуют в строке подключения?
Изменить (20180713):
В моем конкретном случае проблема заключалась в настройке FIPS.
Для тех, кто занимается исследованиями, есть несколько способов обойти это.
Вы можете изменить параметр реестра, расположенный по адресу HKLM\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy\Enabled. Если FIPS включен, значение равно 1. Если отключено, значение равно 0. Вам не нужно перезагружаться.
Скорее всего, причина, по которой вы столкнулись с этой проблемой, заключается в том, что FIPS включен, и вы используете управляемую библиотеку доступа к данным Oracle. Прочный обходной путь - использование неуправляемой библиотеки. Однако для использования этой библиотеки вам необходимо установить Oracle Instant Client. Клиент доступен для загрузки в компонентах доступа к данным Oracle.
Обновите свой сервер до Oracle 12.2c. Версии Oracle 12c до 12.2c все еще имеют эту проблему.
Если у вас не включен FIPS, скорее всего, вам нужно будет выяснить, имеет ли ваша база данных значение SEC_CASE_SENSITIVE_LOGON, установленное в значение true. Вам необходимо выполнить команду ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE; а затем сбросьте все ваши пароли.
11 ответов
Я боролся с той же самой проблемой в течение нескольких недель и наконец имею решение. Мне пришлось отключить политику безопасности FIPS, попробуйте установить этот ключ:
[HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ FipsAlgorithmPolicy] "Включено"=dword:00000000
к нулю, это отлично сработало для меня
Я следил за вашей веткой, ваш пустой пароль в конечном итоге указал мне здесь:
https://community.oracle.com/thread/2557592?start=30&tstart=0
Основано на ответе Джеффа (31.10.2014)...
Параметр реестра может быть установлен GPO, чтобы разрешить только FIPS-совместимые алгоритмы. Установка этого значения в 0, как указано, может нарушать некоторые политики безопасности и перезаписываться объектом групповой политики. Этот параметр реестра контролирует не только IIS или ASP.NET.
Есть еще один способ, который специфичен для.NET и может работать на уровне приложений. Это гораздо легче обосновать по сравнению с изменением настроек всего сервера.
Специфичный метод применения:
В файле Web.config или App.config добавьте следующий параметр:
<configuration> <!-- Will already be there -->
<runtime>
<enforceFIPSPolicy enabled="false"/>
</runtime>
... the rest of your .config
Если я правильно помню, это должно быть в начале вашего файла конфигурации.
Все.NET приложения метод:
Поместите вышеуказанные настройки в файл machine.config. Будет один для каждой версии.NET и архитектуры (64 бит /32 бит). Там уже будет элемент, поэтому поместите элемент внутри него.
У меня была та же проблема с использованием Entity Framework и Oracle.ManagedDataAccess.Client, но я добился определенного успеха, введя верхний регистр своего пароля в разделе строки конфигурации соединения.
Я программирую на C# с базой данных Oracle xe 11g, раньше со мной такого никогда не случалось, но новые пользователи, которых я создал в БД, при попытке подключения из приложения C# выдавали ошибку:
ORA-01017: invalid username / password ; logon denied
, только с новыми пользователями (я делал миграцию с xe 10g на xe 11g) где мигрированные пользователи с версии 10g работали корректно.
Я внес это изменение в свою строку подключения и сумел решить проблему.
до
private string cadenaCone = "User Id=AAA111;Password=BBB222;Data Source=CCC333;Connection Timeout=60;";
после
private string cadenaCone = "User Id=AAA111;Password=" + ((char)34).ToString() + "BBB222"+((char)34).ToString()+";Data Source=CCC333;Connection Timeout=60;";
Я пытался с командой:
ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;
Но это не сработало. Мне пришлось изменить его с помощью разработчика SQL на вкладке DBA.
- Найдите параметр 'sec_case_sensitive_logon' и измените его значение на 'ЛОЖЬ'
- Зафиксируйте ваши изменения с помощью кнопки:
- Он запросит стратегию фиксации, и вы должны выбрать оба варианта:
- Нажмите "Применить"
- Я не знаю, требуется ли этот шаг, но я также изменил пароль пользователя. (Я установил тот же пароль)
В случае, если вы не знаете, как открыть "Параметры инициализации":
- Откройте "Oracle SQL Developer"
- Зайдите в меню "Вид" и выберите "DBA"
- Выберите соединение
- И затем нажмите "Параметры инициализации"
По какой-то причине (и понятия не имею, почему) мой код на C# отправляет мое имя пользователя в верхнем регистре, хотя я пишу его в нижнем регистре.
Например, мое имя пользователя kullaniciadi
вы можете подумать, что это прописные буквы KULLANICIADI
но, похоже, это не так. Язык моего сервера - турецкий (я считаю, что это причина), поэтому версия моего имени в верхнем регистре становитсяKULLANİCİADİ
потому что в турецком верхнем регистре i
является İ
и прописные буквы ı
является I
. И это приводит к ошибке неверного имени пользователя.
Не имел контроля над базой данных, поэтому не мог изменять в ней какие-либо настройки.
Ввод моего имени пользователя в верхнем регистре решил проблему.
Также это работает только в сочетании с принятым ответом. Если ключ реестра, указанный в принятом ответе, установлен на 1, этот ответ может не работать.
Потратил много часов на эту глупость. Я записываю это, чтобы ты не стал.
У меня не был такой же сценарий, как в этом случае, но у меня были очень похожие результаты. Чтобы разобраться в проблеме, я заключил пароль в кавычки, подобные следующим (VB.NET):
cnx.ConnectionString = "User ID=MYID;Password=""MyPass"" ;Data Source=MyTEST"
или используйте chr(34) следующим образом
cnx.ConnectionString = "User ID=MYID;Password="+chr(34)+"MyPass"+chr(34)+" ;Data Source=MyTEST"
У меня была точно такая же проблема. Когда я подключался к базе данных напрямую из SqlDeveloper, она работала нормально. Но мое приложение (построенное на VB6) не смогло подключиться к Oracle и выдало ошибку "ORA-01017 Неверный ID/ пароль.
После выключения, чувствительного к регистру входа в систему для моего идентификатора базы данных, это решило проблему.
У меня такая же проблема! Я не пытался изменить RegKey, но я пытался изменить веб-конфигурацию и конфигурацию машины. Это не сработало.
Что решило проблему, так это изменение пула приложений, в котором я работал!
Пул приложений работал под учетной записью службы, и как только я переместил его в новый пул приложений, используя только системную учетную запись по умолчанию, он начал выбирать идентификатор пользователя и пароль из конфигурации.
Попробуйте использовать одно из следующих в качестве строки подключения:
Data Source=username/password@//myserver:1521/my.service.com;
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID))); User Id=myUsername;Password=myPassword;
Вы можете получить больше информации здесь.