oracle - Oracle - 获取经过身份验证的用户
问题描述
我的 MVC 应用程序连接到 Oracle 数据库。我们创建了很多触发器来保存用户更改的所有数据。
在触发器内部,我们使用下面的代码来获取经过身份验证的用户:
UPPER(SYS_CONTEXT('USERENV', 'OS_USER'))
当我在 localhost 中运行我的应用程序时,数据库会获得正确的用户,但是当我在服务器(IIS)上对其进行 plublish 时,数据库总是以用户身份获得应用程序池名称。
我需要设置一些 IIS 配置来获取“Windows 身份验证”用户吗?还有其他方法可以在 oracle 函数/触发器中获取此信息吗?
解决方案
您实际上希望使用安全的应用程序上下文,它基本上是用户控制的上下文,与系统控制的上下文不同USERENV
。当应用程序代码从池中获得连接时,它会调用一个存储过程,在新的应用程序上下文中设置应用程序用户名。然后,您的触发器将引用新的上下文而不是USERENV
. 您的应用程序需要确保每次从池中获取连接时都正确设置上下文——如果应用程序未能正确设置上下文,您的触发器将获得错误信息。
如果您不想创建自己的上下文,则可以CLIENT_IDENTIFIER
在从池中获得连接时使用USERENV
可以设置的上下文。dbms_session
从功能上讲,这与创建自己的上下文基本相同。不过,创建自己的上下文的好处在于,您可以在未来确定需要时无缝添加属性(即添加客户端浏览器的 IP 地址或如果您有金、银和铜牌客户,则添加层属性)。
有解决问题的替代方法,例如使用代理身份验证。不过,一般来说,这不适用于连接池,尤其是当您拥有大量用户时。
推荐阅读
- html - 将 $_POST 变量从 HTML 电子邮件传递到 webpge
- asp.net-core - 如何在 IIS 的子文件夹中托管 Blazor 服务器应用程序?
- javascript - 当说出某些单词时,如何让 Discord Bot 不发送消息(Node.js)
- c# - ASP.NET-Core 应用程序根目录中的 NLog 日志文件
- google-sheets - ARRAYFORMULA 不添加到每一行
- echarts - 如何在echarts中使用本地图片?
- node.js - 使用 Glob 和 Node.js 选择指定目录及以下目录中某些扩展名的所有文件
- python - Python日期生成未生成正确的日期
- reactjs - (React) useParams 获取 id 并从列表中显示
- javascript - 如何通过单击兄弟元素或父元素来获取 dom 的某个部分