使用c#客户端处理Oracle密码过期和宽限期
本文关键字:过期 宽限期 密码 Oracle 客户端 处理 使用 | 更新日期: 2023-09-27 18:02:29
我有一个c#客户端,我使用oracle 10g数据库。
我的查询是:
- 届满宽限期是否超过届满日期?
- 当用户处于宽限期时,用户是否可以通过查询
ALTER USER XYZ IDENTIFIED BY SOMEPWD
修改自己的密码,或者仍然需要联系DBA。 如何处理oracle警告ORA-28002(当用户在宽限期)在c#客户端。它会被传输到c#客户端吗?是否仍然会被处理为异常(try-catch) ? - 密码已过期,是否只有DBA可以修改密码?
- 当超过宽限期时,帐户也被锁定。
请注意,我不是sys dba,所以我不能访问dba_users或dba_profiles。
我终于找到解决问题的办法了。以下是要点,供大家参考:
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;
在用户成功登录后,我们检查这个函数,看看他们是否接近过期,如果是,提示他们更改密码。