【问题标题】:Oracle password expiry and grace period handling using C# client使用 C# 客户端处理 Oracle 密码到期和宽限期
【发布时间】:2011-10-07 13:28:39
【问题描述】:

我有一个 c# 客户端,我正在使用 oracle 10g 数据库。

我的查询是:

  1. 到期宽限期是否超过到期日?
  2. 当用户处于宽限期时,用户可以使用查询ALTER USER XYZ IDENTIFIED BY SOMEPWD更改他/她的密码,或者他仍然需要联系DBA。
  3. 如何在 c# 客户端中处理 oracle 警告 ORA-28002(当用户处于宽限期时)。它是否会被传输到 c# 客户端。是否仍将其作为异常处理(try-catch)。
  4. 如果密码已经过期,是不是只有DBA才能修改密码。
  5. 如果过期日期超过宽限期,帐户是否也会被锁定。

请注意,我不是 sys dba,因此我无法访问 dba_users 或 dba_profiles。

提前致谢。

【问题讨论】:

    标签: c# oracle oracle10g passwords ora-28002


    【解决方案1】:

    关于第3点:我们的经验是ODP.Net在ORA-28002发生时不会抛出异常也不会触发OracleInfoMessageEventHandler。谷歌搜索只显示这是 ODP 中的一个错误,但没有提到它正在修复。

    这是我们的解决方法...我们创建了一个存储函数,该函数查看 DBA_USERS 以确定给定用户密码的到期日期。创建此函数以在创建者的授权上下文中运行(拥有查看此 DBA 视图的权限)。

    create or replace function GetExpDate(vUser in varchar2) return DATE
    AUTHID DEFINER
    as
    expDate date;
    begin
       select nvl(expiry_date, sysdate+100) 
       into expDate 
       from dba_users
       where username = vUser;
    
       return expDate;
    
    exception
    when others then
       return sysdate+100;
    end; 
    

    用户登录成功后,我们会检查这个功能,看看他们是否接近到期,如果接近,则提示他们更改密码。

    【讨论】:

      【解决方案2】:

      我终于找到了解决问题的方法。以下是供大家参考的要点:

      1) 到期宽限期是否超过到期日?

      答案:是的。

      2) 当用户处于宽限期时,用户可以使用查询“ALTER USER XYZ IDENTIFIED BY SOMEPWD”更改他/她的密码,或者他仍然需要联系 DBA。

      回答:没有用户不能运行此查询,因为它首先需要连接到数据库。密码过期无法连接。

      3) 如何在 c# 客户端中处理 oracle 警告 ORA-28002(当用户处于宽限期时)。它是否会被传输到 c# 客户端。是否仍将其作为异常处理(try-catch)。

      回答:ORA-28002错误可以在c#客户端中作为OracleClientInfoMessage处理。这是示例代码。

      try
      {
          OracleConnection conn = new OracleConnection("User ID=" + uid + ";Password=" + pwd + ";SERVER=" + server);
          conn.InfoMessage += new OracleInfoMessageEventHandler(GetOracleWarningInfoMessage);        
          conn.Open();
          return ConnectionStatus.OK;
      }
      catch (System.Data.OracleClient.OracleException ex)
      {
          Logger.Error(ex);
          switch (ex.Code)
          {
              case 1005: //null password given
                  errmsg = "Invalid password";
                  return ConnectionStatus.InvalidUserPwd;
              case 1017: //invalid username/password
                  errmsg = "Invalid username/password";
                  return ConnectionStatus.InvalidUserPwd;
              case 1040: //invalid character in password
                  errmsg = "Invalid password";
                  return ConnectionStatus.InvalidUserPwd;
              case 28000://account locked
                  errmsg = "Account locked. Contact DBA or wait for PASSWORD_LOCK_TIME";
                  return ConnectionStatus.Locked;
              case 28001://password expired                       
                  errmsg = "Password expired. Contact DBA";
                  return ConnectionStatus.Expired;
              default:
                  errmsg = ex.Message;
                  return ConnectionStatus.Failed;
          }
      }
      

      4) 当密码已经过期时,是不是只有DBA才能修改你的密码。

      回答:用户可以自己修改密码。如果您使用的是 SQLPlus 或 ODP.net 驱动程序,您将收到提示。但是,如果您使用的是 OracleClient (Microsoft) 驱动程序,您将无法使用它,因为它缺少 OpenWithNewPassword 功能(允许在建立连接之前更改密码)。可能是因为 Mircosoft 和 Oracle 之间的非合作运动。 OpenWithNewPassword 支持仅在 Driver ODP(OracleDataProvider) 和本机 OCL 中可用。详情参考链接:MSDNOracle

      5) 当到期日期超过宽限期时,帐户是否也会被锁定。

      答案:不,它会过期而不是锁定。

      【讨论】:

        【解决方案3】:

        是的,宽限期高于到期日,如果我没记错的话,您的到期期限为 30 天,宽限期为 5。现在发布用户已到期的 30 天期限,现在您进入宽限期,从 30 天限制后的第一次登录开始。现在在这 5 天内,您可以选择更改密码。

        Oracle 隐式允许用户更改自己的密码,因此您可以在宽限期内更改密码,否则您将需要另一个有权更改其他用户密码的用户。

        如果您甚至超过了宽限期,则帐户将被锁定,并会在更改密码时解锁。

        【讨论】:

        • thx,关于第 3 点的任何想法。我在 c# 客户端中是否收到错误或警告以及我们如何处理它。
        • 它会引发 InfoMessage 警告事件,您需要检查 ODP.NET 和 Microsoft 提供程序中的 OracleConnection 类在 Oracle 发送警告或信息消息时引发 InfoMessage 事件...Read On
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 1970-01-01
        相关资源
        最近更新 更多