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

时间:2016-11-28 13:02:22

标签: c# oracle proxy connection odp.net

在特定情况下,如何使用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",
};

这不起作用。也没有提供空白"密码"或空白"代理密码"。也没有删除UserId。

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

1 个答案:

答案 0 :(得分:2)

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

 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日编辑:上述行在某些情况下似乎不起作用。添加了关于它的评论,以下是IS工作的代码:

USER ID=[specified_app_user];DATA SOURCE=database

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