【问题标题】:Entify Framework Inserts require Select permissions实体框架插入需要选择权限
【发布时间】:2009-11-10 08:54:47
【问题描述】:

我们使用 LINQ to Entities 将条目写入审计数据库 (SQL Server 2008)。由于这是一个专用的审计数据库,我们插入行 - 我们从不读取任何行、更新或从审计应用程序中删除它们。

审核应用程序应使用最小权限原则,因此我们不希望授予它超出其需要的权限。由于我们从不读取任何行,因此我们不想授予从数据库中进行选择的权限。

但是,当我们尝试写入数据时,我们会收到以下错误消息:

对象“AuditEvent”、数据库“IdentifyAudit”、架构“dbo”的 SELECT 权限被拒绝。

代码是相当标准的 EF 代码:

var auditEvent = new AuditEvent();
auditEvent.EventType = eventType;
auditEvent.Timestamp = timestamp;
auditEvent.UserName = userName;
auditEvent.ApplicationId = this.ApplicationId;

this.objectContext.AddToAuditEvents(auditEvent);
this.objectContext.SaveChanges();

为什么我们需要 SELECT 权限才能写入表,更重要的是:有什么方法可以删除该要求?


编辑

SQL Profiler 显示正在执行的语句:

exec sp_executesql N'insert [dbo].[AuditEvent]([EventType], [Timestamp], [UserName], [ApplicationId])
values (@0, @1, @2, @3)
select [Id]
from [dbo].[AuditEvent]
where @@ROWCOUNT > 0 and [Id] = scope_identity()',N'@0 nvarchar(10),@1 datetimeoffset(7),@2 nvarchar(11),@3 nvarchar(36)',@0=N'UpdateUser',@1='2009-11-10 10:58:33.2814740 +01:00',@2=N'foo',@3=N'bar'

这解释了为什么需要 SELECT 权限,因为该操作返回插入行的自动生成的 ID。

现在问题仍然存在:我不需要知道我刚刚插入的行的 ID,那么有什么方法可以关闭此功能?

【问题讨论】:

  • 已编辑问题以包含 SQL Profiler 数据。

标签: .net security entity-framework linq-to-entities least-privilege


【解决方案1】:

默认情况下,在您将实体添加到 ObjectContext 并调用 SaveChanges 后,该对象的状态会从已添加更改为未更改,并且仍由 ObjectContext 跟踪。这就是 EF 需要该 ID 以便能够跟踪其更改的原因。

Entity Keys and added objects:

1.构造实体对象。 此时关键属性全部 有默认值,null 或 0。

2.新对象被添加到 ObjectContext 要么通过调用 AddObject 或实体之一 中设置特定的添加方法 上下文或通过调用 Add 返回一个导航属性 实体集合。

此时,对象服务 生成一个临时密钥,即 用于存储对象 对象状态管理器。

3.SaveChanges 在 对象上下文。

INSERT 语句由 实体服务并在 数据源。

4.如果INSERT操作成功, 服务器生成的值被写入 返回 ObjectStateEntry。

5.ObjectStateEntry 更新 服务器生成的对象 价值。

6.当 AcceptChanges 被调用时 ObjectStateEntry,一个永久的 EntityKey 是使用新的 服务器生成的值。

因此,据我所知,无法从 ObjectContext 切换此功能,而且我没有看到任何“好的”解决此问题的方法:避免这种情况的一种方法是使用自己的存储过程插入实体(如果可以的话)(http://msdn.microsoft.com/en-us/library/bb399203.aspx)。

另外,如果没有服务器生成的 ID,我认为不会执行 select 查询(同样,如果您可以更改 dbs,并且如果您想打扰 id 的生成)。

【讨论】:

    【解决方案2】:

    但是,这是一个老问题,但将来也许有人会使用。一种方法是仅将选择权限授予 id 字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      相关资源
      最近更新 更多