如何使用Oracle和.Net客户端实现密码更改功能?

2024-03-20

我正在使用 Oracle 用户来验证 .Net 应用程序的用户名和密码。现在我正在研究密码更改功能。数据库具有自定义密码验证,因此如果您尝试更改用户密码并且提供了无效密码,Oracle 将返回多个错误。

第一个错误始终是“ORA-28003:指定密码的密码验证失败”,然后每次验证失败都会出现一个错误。当我尝试从 Toad 客户端更改用户密码时,该信息正确显示。

但是,当我从应用程序中执行此操作时,引发的 OracleException 仅返回第一个错误,因此我无法向用户显示他提供的新密码的哪些内容无效,而这是应用程序的要求。那么我应该如何处理这个问题呢?


对于初学者,不要使用 OpenWithNewPassword 方法。它不仅存在各种版本的 ODP.net 和 DB 的已知问题,而且当您只需要一个代码分支时,它会强制您拥有两个不同的代码分支 - IIRC 如果用户的密码已经过期,它就不起作用。

相反,基本逻辑是这样的:

  • 确保可以使用用户的旧帐户和密码进行身份验证

  • 如果成功,请关闭该连接并打开一个单独的帐户,该帐户除了对 ChangePassword 存储过程执行 exec privs 之外没有任何访问权限。

这是代码:

protected void BtnChangePassword_Click(object sender, EventArgs e)
{
  String connectionStringFormat = "Data Source={0};User Id={1};Password={2};pooling=false;";
  if (Page.IsValid)
  {
    Boolean hasHasError = false;
    String connectionString = String.Format(
      connectionStringFormat,
      IptDatabase.Text,
      IptUserName.Text,
      IptOldPassword.Text);
    OracleCommand cmd = new OracleCommand();
    using (cmd.Connection = new OracleConnection(connectionString))
    {
      try
      {
        cmd.Connection.Open();
      }
      catch (OracleException ex)
      {
        //allow to continue if the password is simply expired, otherwise just show the message
        if (ex.Number != 28001)
        {
          ShowErrorMessage(ex.Message);
          hasHasError = true;
        }
      }

      if (!hasHasError)
      {
        //successful authentication, open as password change account
        cmd.Connection.Close();
        cmd.Connection.ConnectionString = ConfigurationManager.ConnectionStrings[IptDatabase.Text].ConnectionString;
        cmd.Connection.Open();
        cmd.CommandText = "SysChangePassword";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("username", IptUserName.Text);
        cmd.Parameters.Add("newpassword", IptPassword.Text);
        try
        {
          cmd.ExecuteNonQuery();
          ShowInfoMessage("Password Changed");
        }
        catch (OracleException ex)
        {
          ShowErrorMessage(ex.Message);
        }


      }
    }
  }

在最简单的形式中,过程执行 'alter useridentified by 并类似于此处记录的内容:http://www.adp-gmbh.ch/ora/plsql/change_password.html http://www.adp-gmbh.ch/ora/plsql/change_password.html。然而 dbms_output 行对你没有多大好处,所以你可以抛出自定义异常:

create or replace procedure SysChangePassword(
  pUserName in varchar2, 
  pPassWord in Varchar2) as
begin
  -- Check for system users here and reject
  if upper(pUserName) in ('SYS','SYSTEM') then
            raise_application_error(-20012, 'not allowed');
  else
     execute immediate 'alter user '||pUserName||' identified by ' ||
           pPassWord;
  end if;
  exception --this isn't necessary if you'd rather examine and handle the specific exceptions on the .net side
     when others then
        raise_application_error(-20012, sqlerrm);
end;
/

拥有此过程的模式需要“更改任何用户”权限。为了安全起见,您的应用程序应作为单独的用户进行连接,该用户仅在此过程上具有执行权限。相当

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Oracle和.Net客户端实现密码更改功能? 的相关文章

  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • gdb 在 docker 上立即退出“进程已完成,退出代码 1”或 lldb“数据包返回错误 8”。另外:如何在 docker 中允许进行 C++ 调试

    这花了我一整天的时间才找到 所以我将其发布以供将来参考 我正在 docker 镜像上开发 C 我正在使用克利翁 我的代码是在调试模式下编译的 并且在运行模式下运行良好 但是当尝试调试时 进程会立即退出 并显示非常丰富的信息 Process
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 将数据从 oracle 移动到 HDFS,处理并从 HDFS 移动到 Teradata

    我的要求是 将数据从 Oracle 移至 HDFS 处理HDFS上的数据 将处理后的数据移至 Teradata 还需要每 15 分钟执行一次整个处理 源数据量可能接近50GB 处理后的数据也可能相同 在网上搜索了很多之后 我发现 PRARO
  • 如何打开 Windows 资源管理器窗口并选择特定文件夹

    我有一个 winform 应用程序 这个 winform 应用程序创建了几个文件 我想在我的应用程序中实现 查找目标 功能来显示这些文件 这些文件位于同一文件夹中 看图片 假设我创建了几个文件 C Test 文件夹 该文件夹包含以下文件 C
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu

随机推荐