EF具有SQL server应用程序角色

本文关键字:应用程序 角色 server SQL 具有 EF | 更新日期: 2023-09-27 18:15:03

我需要在sql server上使用应用程序规则安全性。我想先使用实体框架代码。

成功登录后,我的连接被设置为应用程序角色。然后,我使用这个连接创建我的DbContext。

But: EF期望一个关闭的连接对象。并且关闭连接会删除应用程序角色。

我该如何解决这个困境?

EF具有SQL server应用程序角色

我通过两步完成了这项工作:

关闭连接池,这在使用应用程序角色的连接中一直被提及。因为我有一个桌面应用程序,所以这对我来说不成问题。

DbConnection.StateChanged添加处理程序,并在每次打开连接时激活应用程序角色。如果没有连接池,关闭时不需要sp_unsetapprole。这对我来说很有用:

context.Database.Connection.StateChanged += (sender, args) =>
  if (args.CurrentState == ConnectionState.Open) {
    activateAppRole((DbConnection)sender, ...);
  }
}

我猜,如果池对某人来说是至关重要的,她可能会在关闭连接时调用sp_unsetapprole

由于这个问题在搜索结果列表中排名很高,我只是想提醒一下。我有一个应用程序,需要使用应用程序角色和okrumnow的解决方案似乎首先工作。

然而,在单元测试中,我发现有时处理StateChanged事件会导致事件被触发两次,您将得到错误:

"冒充会话安全上下文"不能在此批处理中调用,因为同步批处理已经调用了它。

把条件句改成:

args.CurrentState == ConnectionState.Open &&
    args.CurrentState == ConnectionState.Closed

但是它仍然不能消除错误。我在EF4.3和EF5中确认了这一点。Ladislav是正确的,理想的方式是为DbContext创建一个连接,并告诉context它不拥有它。

此外,连接池永远不可能与此设置,因为没有ConnectionState.Closing事件,您可以在连接关闭之前调用sp_unsetapprole

因为我有灵活性,我的解决方案是消除应用程序角色的使用,而使用专用的SQL登录。无论哪种方式,你都在硬编码密码…

EF没有任何本机支持。我想解决方法是:

    创建自己的连接并将其(关闭)传递给EF context/EntityConnection。这应该强制你将有连接生命周期在你的控制和EF不会关闭它(但我已经看到抱怨,它不工作与DbContext)。
  • 一旦创建了上下文实例,设置应用程序角色。上下文本身不应该生成任何对数据库的查询(除了DbContext的代码首先检查数据库的版本),所以在创建上下文之后设置角色应该不会导致任何问题。