使用C#客户端进行Oracle密码到期和宽限期处理

时间:2011-07-18 10:07:39

标签: c# oracle oracle10g passwords ora-28002

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

我的查询是:

  1. 是否有效期限超过了有效期?
  2. 当用户处于宽限期时,用户可以使用查询ALTER USER XYZ IDENTIFIED BY SOMEPWD更改其密码,或者仍需要联系DBA。
  3. 如何在c#客户端中处理oracle警告ORA-28002(当用户处于宽限期时)。是否完全传递给c#客户端。它是否仍然作为例外处理(try-catch)。
  4. 当密码已过期时,只有DBA才能更改密码。
  5. 当到期日超过宽限期时,帐户也会被锁定。
  6. 请注意我不是sys dba所以我无法访问dba_users或dba_profiles。

    提前致谢。

3 个答案:

答案 0 :(得分:4)

最后,我找到了解决问题的方法。以下是每个人信息的要点:

1)到期宽限期是否超过了有效期?

答案:是的,超过了它。

2)当用户处于宽限期时,用户可以使用查询“由SOMEPWD识别的ALTER USER XYZ”来更改他/她的密码,或者他仍然需要联系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)当到期日超过宽限期时,账户也会被锁定。

答案:不会过期但未锁定。

答案 1 :(得分:1)

是的,宽限期高于失效日期,如果我没有弄错,这就是它发生的原因,你有30天的有效期和5的优惠。现在发布30天的期限,用户已过期,现在你进入宽限期,这是在30天限制后首次登录时的重要时间。现在,在这5天内,您可以选择更改密码。

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

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

答案 2 :(得分:0)

关于第3点:根据我们的经验,当ORA-28002发生时,ODP.Net不会抛出异常,也不会触发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; 

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