您如何通过无密码代理用户从 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
此信息似乎在任何地方都不存在 - 否则我忽略了它,在那种情况下请纠正我。
关于在非常具体的情况下如何使用 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
此信息似乎在任何地方都不存在 - 否则我忽略了它,在那种情况下请纠正我。