2016-11-28 6 views
0

Кажется, нет ответа в Интернете о том, как вы можете использовать Oracle Data Provider для .NET (ODP.NET) для подключения к Oracle (12G и позже) в очень конкретной ситуации:Как вы подключаетесь из ODP.NET к Oracle (12G +) с помощью прокси-пользователя без пароля?

  • Пользователь идентифицируется внешне на базе
  • пользователь получает доступ к другой схеме (пользователя приложение) по доверенности подключения

Пользователь был настроен следующим образом:

CREATE USER user_in_question 
IDENTIFIED EXTERNALLY 
-- etc. 

И подключаете по доверенности был создан как это:

ALTER USER specified_app_user GRANT CONNECT THROUGH user_in_question 

Логический подход при создании строки ODP.NET OracleConnection будет что-то вроде этого (используя дружественный пользователю OracleConnectionStringBuilder):

var connBuilder = new OracleConnectionStringBuilder 
{ 
    UserID = "/", // External login using the user running the program 
    ProxyUserId = "specified_app_user", 
    DataSource = "database", 
}; 

Это не работает. Также не предоставляет пустой «Пароль» или пустой «Пароль прокси». Также не удаляется UserId.

Итак, как вы подключаетесь с использованием ODP.NET в этих обстоятельствах?

ответ

1

Ответ (который я провожу час в поисках без удачи) на самом деле очень просто, но не очень удобный:

var connBuilder = new OracleConnectionStringBuilder 
{ 
    UserID = "[specified_app_user]", 
    DataSource = "database", 
}; 
//connBuilder.ToString() output: 
//"USER ID=[specified_app_user];DATA SOURCE=database" 

Это работает в .NET 4.5+ на Oracle 12G +, но, вероятно, также на более ранних платформах .NET/Oracle/ODP.NET. Я не тестировал его в ASP.NET, но он тоже должен работать.

Таким образом, UserId фактически функционирует так же, как ProxyUserId, просто заключенный в скобки, так же, как вы обычно входите в базу данных Oracle, используя, скажем, Toad или SQlPlus.

Это также может быть возможным, используя этот формат (но в моем случае строка соединения должна быть совместима с форматом OraOLEDB так, что не работает):

//Without the use of the conn string builder class, just for the fun of it... 
var connString = "User Id=specified_app_user;Data Source=database;Proxy User Id=/"; 

EDITED 2 марта 2017: линия выше похоже, не работает в определенных случаях. Добавлен комментарий по этому поводу, и вот код, который работает:

USER ID=[specified_app_user];DATA SOURCE=database 

Эта информация, кажется, не существует нигде - еще я проглядел его, и в этом случае, пожалуйста, поправьте меня.

+0

Обратите внимание, что указанный пользователь приложения не имеет скобок, если строка соединения указана с использованием идентификатора пользователя прокси =/ – StefanDK

+0

. Это также допустимый формат: var connBuilder = новый OracleConnectionStringBuilder {UserID = "указанный_app_user", DataSource = "database", ProxyUserId = "/"} Тогда скобки не нужны, потому что идентификатор пользователя прокси указывается как/(текущий пользователь) – StefanDK

+0

Кажется, что хотя «User Id = указанный_app_user; Источник данных = база данных; Идентификатор пользователя прокси = /« ДОЛЖЕН работать, он делает не всегда. Правильный рабочий путь состоит в том, чтобы включить [] в целевую схему: ИДЕНТИФИКАТОР ПОЛЬЗОВАТЕЛЯ = [defined_app_user]; DATA SOURCE = database – StefanDK