使用c#客户端处理Oracle密码过期和宽限期

本文关键字:过期 宽限期 密码 Oracle 客户端 处理 使用 | 更新日期: 2023-09-27 18:02:29

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

我的查询是:

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

请注意,我不是sys dba,所以我不能访问dba_users或dba_profiles。

使用c#客户端处理Oracle密码过期和宽限期

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

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功能(允许在建立连接之前更改密码)。可能是因为微软和甲骨文之间的不合作运动。OpenWithNewPassword支持仅在Driver ODP(OracleDataProvider)和本机OCL中可用。详细信息请参考链接:MSDN或Oracle

5)如果超过宽限期,帐户也会被锁定吗?

答案:No,它得到的是Expired而不是Locked。

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

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

如果超过宽限期,帐户将被锁定,并在修改密码时解锁。

关于第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; 

在用户成功登录后,我们检查这个函数,看看他们是否接近过期,如果是,提示他们更改密码。