首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >EFCore canConnect为锁定的帐户返回true

EFCore canConnect为锁定的帐户返回true
EN

Stack Overflow用户
提问于 2020-07-02 12:32:38
回答 1查看 123关注 0票数 0

Microsoft.EntityFrameworkCore.Infrastructure DatabaseFacade.CanConnect()中,我遇到了一些奇怪的行为,即使当用户帐户被锁定时,这也会返回true,条件是该帐户在应用程序生存期内已经登录过一次。

以下是我所遵循的步骤和我所遇到的情况:

application

  • User
  1. Start web
  2. 导航到web页面并进入其DB登录
  3. 我检查用户详细信息可以使用canConnect()连接到DB,这将返回true,页面显示有一些查询结果
  4. I锁定用户帐户在Oracle
  5. 中用户注销并刷新页面H 213H 114用户刷新页面并输入其DB登录H 215H 116我检查用户详细信息可以使用d17连接到DB,这将返回true,页面显示有一些查询结果--尽管用户帐户是locked
  6. I重新启动web应用程序(应用程序池重置/停止启动),
  7. 用户刷新网页并进入其DB登录
  8. I检查用户详细信息可以使用canConnect()连接到DB,这会引发一个异常,因为用户帐户被锁定了

为什么如果我锁定帐户,用户可以继续连接到数据库,直到应用程序停止/启动/回收?我不会在C#中使用任何缓存。

我使用的是EFCore 2.2.6和Oracle.ManagedDataAccess.Core 2.19.31

Db服务的作用域为http请求:

代码语言:javascript
运行
复制
services.AddScoped<IOracleAuthenticationModule, OracleAuthenticationModule>();

OracleAuthenticationModule:

代码语言:javascript
运行
复制
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");
}
EN

Stack Overflow用户

发布于 2020-07-02 12:54:44

请记住,如果池正在执行ALTER xxx帐户锁,要锁定池本身使用的db帐户,则此命令不影响已在池中打开的连接。

当您锁定Oracle中的用户帐户时,如果用户注销并再次登录,您的池可能不会打开一个新连接,而是重用在锁发生之前已经可用的现有连接。池通常配置为重用现有连接,以避免以连接/断开的形式进行昂贵的操作。

这就是我认为锁在池再次尝试打开一个新连接之前不会影响的,这种情况在停止/启动时发生。

试着看一下

https://docs.oracle.com/database/121/ODPNT/featConnecting.htm#ODPNT170

如果您可以选择检查数据库中的v$session,那么在启动应用程序并运行对数据库的第一个请求时,您将看到池打开了多少个连接。

遵循Oracle文档

打开新连接时,如果连接字符串与现有池不完全匹配,则创建一个新池。在ODP.NET 12.1.0.2之前,只有连接字符串属性值必须匹配。现在,连接字符串本身必须是完全匹配的。为同一连接以不同顺序提供的关键字将单独池。如果已存在具有请求签名的池,则将从该池向应用程序返回连接。创建连接池时,连接池服务最初创建由ConnectionString属性的Min属性定义的连接数。连接池的连接池服务总是维护此数目的连接。在任何给定的时间,这些连接都由应用程序使用,或者在池中可用。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62696406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档