【问题标题】:Entity Framework and SQL Server user roles: how to enable EF to generate role-aware queries?实体框架和 SQL Server 用户角色:如何使 EF 生成角色感知查询?
【发布时间】:2012-01-24 01:05:12
【问题描述】:

背景

我们有一个使用 SQL Server 2008 R2 的带有实体框架 4.2 代码优先/FluentAPI 的 WinForms 应用程序。

安全性是IPrincipalIIdentity 的自定义实现,具有用户角色。显示表单/菜单/按钮时会检查这些角色,并将根据用户角色将其禁用/删除。

用户根据数据库进行身份验证,因此连接没有“主”用户:它是使用登录屏幕上提供的用户名/密码创建的。

因此,对数据(一般)的访问是有效的。

问题

但某些情况下可能需要我禁用对特定表或表内列的访问。

这里的一些测试表明,IGenericRepository.Find<MyCustomType>(_idToFind)(返回完整的实体)会失败,因为无法访问单个列并且 SQL 服务器会阻止整个 select 语句。

然而,我发现创建一个类似的查询

IGenericRepository.All<MyCustomType>().Select(_c => _c.JustASingleField) 

会起作用,因为生成的查询只会查找我有权访问的特定字段。

问题

我有没有办法创建对数据库具有角色感知能力的查询?

例如:Find&lt;MyCustomType&gt;(id) 将照常返回对象,但用户无权访问的字段设置为 NULL 或没有值?

或者我只需要为每个不需要保护的项目编写“通用”查询并依赖安全系统来完全阻止对资源的访问?

另一个例子是填充一个网格,但用户无权访问的列将是空白的。

是否有可能使用实体框架?

【问题讨论】:

    标签: security sql-server-2008 entity-framework-4


    【解决方案1】:

    是否有可能使用 EntityFramework?

    没有。 EF 不知道 SQL Server 上的安全配置,除了提供连接字符串的凭据外,它无法响应 SQL Server 预期的任何安全要求。

    如果您需要这种类型的安全性,您应该使用仅向特定角色提供可访问项目的数据库视图,并让 EF 使用模型映射仅查看用户角色有权访问的视图 - 这可能会导致大量不同的“模型”由于角色众多。

    【讨论】:

    • 它将在这里产生数百个模型,因为我们为每个项目动态地创建了客户角色(插入、删除、更新、选择每个表)。我们没有这种情况,但我们根本不能说“哦,仅仅因为我们今天没有那个,就意味着我们永远不会有那个”。我考虑过一个自定义提供程序,但它会导致将每个权限存储到内存中,并且每次都查询该权限以从表达式树中检查和创建 SQL。太糟糕了这个选项不会顺利=/
    • 如果您有动态的客户创建角色,您应该在应用程序中维护它们,而不是使用 SQL Server 安全性。如果您使用 SQL Server 安全性,您将不得不放弃 EF 并使用应用程序中的角色来构建正确的查询。
    • 标记为答案,因为 Microsoft 还表示 EF 在我尝试做的方式上不提供任何安全支持。我想我得把两者混合起来。问题是我有一个身份验证系统,它应该与系统内的角色或域中的角色一起使用。我会看看我能做什么,可能还有 MEF 的某种插件。
    • EF 6 改变了吗? EF 6 或 7 能否访问 SQL Server 的安全配置?
    猜你喜欢
    • 1970-01-01
    • 2015-11-02
    • 2010-11-12
    • 2013-07-18
    • 2015-01-02
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多