【问题标题】:Oracle - Get authenticated userOracle - 获取经过身份验证的用户
【发布时间】:2019-02-19 04:39:35
【问题描述】:

我的 MVC 应用程序连接到 Oracle 数据库。我们创建了很多触发器来保存用户更改的所有数据。

在触发器内部,我们使用下面的代码来获取经过身份验证的用户:

UPPER(SYS_CONTEXT('USERENV', 'OS_USER'))

当我在 localhost 中运行我的应用程序时,数据库会获得正确的用户,但是当我在服务器 (IIS) 上对其进行 plublish 时,数据库总是会以用户身份获得应用程序池名称。

是否需要设置一些 IIS 配置才能获取“Windows 身份验证”用户?还有其他方法可以在 oracle 函数/触发器中获取此信息吗?

【问题讨论】:

    标签: oracle iis


    【解决方案1】:

    您实际上希望使用secure application context,它基本上是用户控制的上下文,与系统控制的USERENV 上下文不同。当应用程序代码从池中获得连接时,它会调用一个存储过程,在新的应用程序上下文中设置应用程序用户名。然后,您的触发器将引用新上下文而不是 USERENV。您的应用程序需要确保每次从池中获取连接时都正确设置上下文——如果应用程序未能正确设置上下文,您的触发器将获得错误信息。

    如果您不想创建自己的上下文,可以使用USERENV 中的CLIENT_IDENTIFIER,只要您从池中获得连接,您就可以通过dbms_session 进行设置。从功能上讲,这与创建自己的上下文基本相同。不过,创建自己的上下文的好处是,您可以在未来确定需要时无缝添加属性(即,添加客户端浏览器的 IP 地址或如果您有金牌、银牌和铜牌客户,则添加层属性)。

    还有其他解决问题的方法,例如使用proxy authentication。但是,一般来说,这不适用于连接池,尤其是当您拥有大量用户时。

    【讨论】:

    • 许多语言都直接调用设置CLIENT_IDENTIFIER,例如在 PHP OCI8 中,您可以使用 oci_set_client_identifier($c, 'myname')。您的 SQL 查询将使用 ... where sys_context('userenv', 'client_identifier') = 'myname'; 查看文章 oracle.com/technetwork/articles/dsl/…
    • 非常感谢您的回答。我现在正在检查如何通过 Asp.Net 更新这个值。
    猜你喜欢
    • 2018-11-26
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 2018-06-13
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多