gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:05:47 24 4
gpt4 key购买 nike

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

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

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

最佳答案

对于初学者,不要使用 OpenWithNewPassword 方法。它不仅存在各种版本的 ODP.net 和数据库的已知问题,而且当您只需要一个时,它会强制您拥有两个不同的代码分支 - 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);
}


}
}
}

在最简单的形式中,proc 执行“改变用户标识并类似于此处记录的用户: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;
/

拥有此过程的架构需要“更改任何用户”权限。为了安全起见,你的应用程序应该作为一个单独的用户连接,这个用户只对这个过程有执行特权。而是

关于c# - 如何使用 Oracle 和 .Net 客户端实现密码更改功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15911374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com