您如何通过无密码代理用户从 ODP.NET 连接到 Oracle (12G+)

How do you connect from ODP.NET to Oracle (12G+) by proxy user with no password

关于在非常具体的情况下如何使用 Oracle Data Provider for .NET (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",
};

这不起作用。也不提供空白 "Password" 或空白 "Proxy Password"。删除 UserId 也没有。

那么在这些情况下如何使用 ODP.NET 进行连接?

答案(我花了一个小时搜索但没有任何运气)实际上非常简单,但不是很用户友好:

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

这适用于 Oracle 12G+ 上的 .NET 4.5+,但也可能适用于 .NET/Oracle/ODP.NET 的早期平台。我没有在 ASP.NET 中测试它,但它应该也能在那里工作。

这样 UserId 实际上就像 ProxyUserId 一样工作,只是用括号括起来,就像您通常使用 Toad 或 SQlPlus 登录 Oracle 数据库一样。

也可以使用这种格式(但在我的例子中,连接字符串必须与 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=/";

2017 年 3 月 2 日编辑:在某些情况下,上面的行似乎不起作用。添加了关于它的评论,这是正在运行的代码:

USER ID=[specified_app_user];DATA SOURCE=database

此信息似乎在任何地方都不存在 - 否则我忽略了它,在那种情况下请纠正我。