【问题标题】:How do you connect from ODP.NET to Oracle (12G+) by proxy user with no password你如何通过没有密码的代理用户从 ODP.NET 连接到 Oracle (12G+)
【发布时间】:2016-11-28 13:02:21
【问题描述】:

网上似乎没有关于如何在非常特定的场景中使用 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 进行连接?

【问题讨论】:

    标签: c# oracle proxy connection odp.net


    【解决方案1】:

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

     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
    

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

    【讨论】:

    • 请注意,当使用 Proxy User Id 指定连接字符串时,指定的应用用户没有括号=/
    • 这也是一个有效的格式: var connBuilder = new OracleConnectionStringBuilder { UserID = "specified_app_user", DataSource = "database", ProxyUserId = "/" } 然后不需要括号,因为代理用户 id 是指定为 /(当前用户)
    • 似乎虽然“User Id=specified_app_user;Data Source=database;Proxy User Id=/”应该有效,但并非总是如此。正确的工作方式是在目标模式周围包含 []:USER ID=[specified_app_user];DATA SOURCE=database
    • 如果我自己的用户也是 SQL 登录用户,即不是外部用户怎么办?我自己的用户名和 app_username 会在连接字符串中的哪个位置?
    • 如果您的意思是您的用户由密码识别,您应该能够在连接字符串的密码部分提供密码。它在 Oracle 中描述:oracle-base.com/articles/misc/proxy-users-and-connect-through : CREATE USER test_user IDENTIFIED BY test_user;通过 test_user 更改用户 scott GRANT CONNECT; CONN test_user[scott]/test_user;这应该转换为“User Id=specified_app_user;Data Source=database;Proxy User Id=/;Password=myPassword”或类似
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多