c# – 使用过期密码防止ODP.net连接打开
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用过期密码防止ODP.net连接打开,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5027字,纯文字阅读大概需要8分钟。
内容图文
![c# – 使用过期密码防止ODP.net连接打开](/upload/InfoBanner/zyjiaocheng/770/67c242d89bbb4e01bcf0d58354f2136d.jpg)
我正在使用一个使用oracle安全性来验证用户的Silverlight应用程序. (这是业务要求,因此无法更改).
我通过调用WCF Web服务来尝试使用提供的用户名和密码打开与数据库的连接.如果连接失败,我捕获异常并向用户返回一条消息,这是登录代码:
[OperationContract]
public LoginResult LogIn(string username, string password, DateTime preventCache)
{
var result = new List<string>();
try
{
connectionString = ConfigurationManager.ConnectionStrings["SecurityBD"].ToString();
connectionString = connectionString.Replace("[username]", username);
connectionString = connectionString.Replace("[password]",passowrd)
using (var connection = new Oracle.DataAccess.Client.OracleConnection())
{
connection.ConnectionString = connectionString;
connection.Open();
if (connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
return new LoginResult(true, GetPermisos(username), preventCache);
}
else
{
return new LoginResult(false, null, preventCache);
}
}
}
catch (Oracle.DataAccess.Client.OracleException ex)
{
if (ex.Number == 1017)
{
return new LoginResult(new SecurityError("Wrong credentials.", ErrorType.InvalidCredentials));
}
//Password expired.
if (ex.Number == 28001)
{
return new LoginResult(new SecurityError("Password expired.", ErrorType.PasswordExpired));
}
//Acount is locked.
if (ex.Number == 28000)
{
return new LoginResult(new SecurityError("Account is locked.", ErrorType.AccountLocked));
}
else
{
return new LoginResult(new SecurityError("An error occurred while attempting to connect." + Environment.NewLine + "Error: " + ex.ToString(), ErrorType.UndefinedError));
}
}
catch (Exception exg)
{
return new LoginResult(new SecurityError("An error occurred while attempting to connect." + Environment.NewLine + "Error: " + exg.ToString(), ErrorType.UndefinedError));
}
}
如果连接因密码过期而失败,我会向用户显示相应的消息,然后提示他输入旧密码和新密码,然后将新凭据发送到我的网络服务上的ChangePassword方法.
[OperationContract]
public ChangePasswordResult ChangePassword(string username, string oldPasswrod, string newPassword)
{
string connectionString = string.Empty;
try
{
connectionString = ConfigurationManager.ConnectionStrings["SecurityBD"].ToString();
connectionString = connectionString.Replace("[username]", username);
connectionString = connectionString.Replace("[password]",passowrd)
using (var connection = new OracleConnection(connectionString))
{
connection.Open();
if (connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
using (var newConnection = new Oracle.DataAccess.Client.OracleConnection(connectionString))
{
newConnection.OpenWithNewPassword(Cryptography.TransportDecrypt(newPassword));
if (newConnection.State == System.Data.ConnectionState.Open)
{
return new ChangePasswordResult(null);
}
}
}
return new ChangePasswordResult(new SecurityError("Couldn't connect to the database.", ErrorType.UndefinedError));
}
}
catch (OracleException ex)
{
if (ex.Number == 1017)
{
return new ChangePasswordResult(new SecurityError("Wrong password", ErrorType.InvalidCredentials));
}
//Password expired.
if (ex.Number == 28001)
{
using (var newConnection = new Oracle.DataAccess.Client.OracleConnection(connectionString))
{
try
{
newConnection.OpenWithNewPassword(Cryptography.TransportDecrypt(newPassword));
if (newConnection.State == System.Data.ConnectionState.Open)
{
return new ChangePasswordResult(null);
}
else
{
return new ChangePasswordResult(new SecurityError("No se pudo establecer una conexión con la base de datos", ErrorType.UndefinedError));
}
}
catch (Oracle.DataAccess.Client.OracleException oex)
{
if (oex.Number == 28003)
return new ChangePasswordResult(new SecurityError("You'r new password does not match the security requeriments.." + Environment.NewLine + oex.Message, ErrorType.PasswordNotChanged));
else
return new ChangePasswordResult(new SecurityError(oex.Message, ErrorType.UndefinedError));
}
}
}
//Acount is locked.
if (ex.Number == 28000)
{
return new ChangePasswordResult(new SecurityError("Account is locked.", ErrorType.AccountLocked));
}
else
{
return new ChangePasswordResult(new SecurityError("Couldn't establish a connection." + Environment.NewLine + "Error: " + ex.Message, ErrorType.UndefinedError));
}
}
catch
{
throw;
}
}
执行更改密码操作后,用户仍然可以使用旧密码连接,并且无法使用新密码进行连接.只有在我重新启动应用程序后,更改才会生效.
我正在使用oracle的ODP.net驱动程序.使用Microsoft的oracle客户端,用户可以在密码更改后连接新密码和旧密码.
preventCache参数仅用于验证没有类型的客户端缓存.我从客户端发送当前日期,然后从Web服务返回相同的值,以查看它是否随后的请求实际更改,并且它按预期执行.
我已经尝试监听连接的InfoMessage事件,看看是否有任何警告,但这样做可以防止密码过期异常上升,代码永远不会到达eventHandler.
我完全迷失了,这种行为对我来说似乎很奇怪,我仍然没有找出问题的根本原因.
我试过在桌面(WPF)应用程序上复制LogIn和ChangePassword方法,它的行为完全相同.所以我想问题不在于Silverlight客户端.
解决方法:
好的,我已经弄明白了.使用Toad检查连接是否在执行Connection.Close()方法后提醒了opend.这种行为似乎是oracle连接池机制的一部分.
在连接字符串上包含Pooling = false解决了问题.
内容总结
以上是互联网集市为您收集整理的c# – 使用过期密码防止ODP.net连接打开全部内容,希望文章能够帮你解决c# – 使用过期密码防止ODP.net连接打开所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。