【发布时间】: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