我正在创建登录窗口以从我的应用程序连接Oracle(现有数据库中的C#Entity Framework Code First)。我想让用户能够设置自己的用户名\密码来与数据库连接。我试图在DbContext中更改连接字符串,但这是行不通的。连接字符串似乎已更改,但是提供程序返回无效的login \ password异常。当我尝试使用已存储的传递字符串连接数据库时,一切正常。我认为这种行为有一些安全原因。如何在运行时正确更改连接字符串?我正在使用VS 2017,实体框架6,Oracle.ManagedDataAccess 18.3,Oracle 11.2 Server。
App.config
name="ConnStrPass" connectionString="DATA SOURCE=titan;PASSWORD=REALPASS;PERSIST SECURITY INFO=True;USER ID=BEE" providerName="Oracle.ManagedDataAccess.Client"
name="ConnStrNoPass" connectionString="DATA SOURCE=titan;PASSWORD=QWERTY;PERSIST SECURITY INFO=True;USER ID=BEE" providerName="Oracle.ManagedDataAccess.Client"
DBDemoModel.cs
public partial class DBDemoModel : DbContext
{
public DBDemoModel()
: base("name=ConnStrPass")
{
}
//overriding constructor DBDemoModel to change pass in ConnectionString
public DBDemoModel(string pass)
: base("name=ConnStrNoPass")
{
this.Database.Connection.ConnectionString = this.Database.Connection.ConnectionString.Replace("QWERTY", pass);
}
AbonentsFinder.cs //工作正常
public List<ABONENTS> SelectAbonentsByName(string textToFind)
{
using (DBDemoModel db = new DBDemoModel())
{
var cont = db.ABONENTS.Where(a => a.OWNER.Contains(textToFind));
var abon = cont.ToList();
return new List<ABONENTS>(abon);
}
}
AbonentsFinder.cs //无效的用户名\登录名
public List<ABONENTS> SelectAbonentsByName(string textToFind, string pass)
{
using (DBDemoModel db = new DBDemoModel(pass))
{
var cont = db.ABONENTS.Where(a => a.OWNER.Contains(textToFind));
var abon = cont.ToList(); //exception
return new List<ABONENTS>(abon);
}
}
DBDemoModel.cs //System.NotSupportedException
public DBDemoModel(string pass)
: base(new OracleConnection("DATA SOURCE=titan; PASSWORD="+pass+";USER ID=BEE"), true)
{
}
您需要登录才能更改密码(类似于大多数网站会先要求您输入当前密码的方式。
因此,让他们使用现有密码登录,之后您可以通过连接对象运行以下命令:
“通过他们的新密码标识的用户MY_USER”