【发布时间】:2020-10-23 01:21:18
【问题描述】:
我遇到了 Microsoft.EntityFrameworkCore.Infrastructure DatabaseFacade.CanConnect() 的奇怪行为,即使用户帐户被锁定,只要该帐户在应用程序生命周期内已经登录过一次,它也会返回 true。
以下是我正在遵循的步骤以及遇到的情况:
- 启动网络应用程序
- 用户导航到网页并输入他们的数据库登录名
- 我检查了用户详细信息是否可以使用
canConnect()连接到数据库,这会返回 true,并且页面会显示一些查询结果 - 我在 Oracle 中锁定了用户帐户
- 用户退出 Web 应用程序并刷新页面
- 用户刷新网页并输入他们的数据库登录名
- 我检查了用户详细信息是否可以使用
canConnect()连接到数据库,这会返回 true,并且页面会显示一些查询结果 - 尽管用户帐户被锁定 - 我重新启动 Web 应用程序(应用程序池重置/停止启动)
- 用户刷新网页并输入他们的数据库登录名
- 我检查了用户详细信息可以使用
canConnect()连接到数据库,这会引发异常,因为用户帐户被锁定
为什么如果我锁定帐户,用户可以继续连接到数据库,直到应用程序停止/启动/回收?我没有在 C# 中使用任何缓存。
我正在使用 EFCore 2.2.6 和 Oracle.ManagedDataAccess.Core 2.19.31
Db 服务的范围是每个 http 请求:
services.AddScoped<IOracleAuthenticationModule, OracleAuthenticationModule>();
OracleAuthenticationModule:
public struct UserConnection
{
public string User { get; set; }
public string Password { get; set; }
public string DataSource { get; set; }
}
public OracleDbContext InitialiseUserDb(UserConnection connection)
{
return InitialiseDb($"Data Source={connection.DataSource};User Id={connection.User};Password={connection.Password};Persist Security Info=True;");
}
private OracleDbContext InitialiseDb(string connectionString)
{
DbContextOptionsBuilder<OracleDbContext> optionsBuilder = new DbContextOptionsBuilder<OracleDbContext>();
optionsBuilder.UseOracle(connectionString);
OracleDbContext db = new OracleDbContext(optionsBuilder.Options);
if (db.Database.CanConnect())
{
return db;
}
throw new Exception("Unable to connect to Oracle database, please verify credentials");
}
【问题讨论】:
-
连接池的用户和锁账户的用户是一样的吗?您是否通过 ALTER USER xxx ACCOUNT LOCK 锁定了帐户。 ?
-
不,一个用户连接帐户“ABC”,然后它被另一个帐户“ADMIN”锁定
标签: c# oracle .net-core entity-framework-core ef-core-2.2