WCF数据服务对单个表列的权限,而不是对整个实体的权限

本文关键字:权限 实体 单个表 数据 WCF 服务 | 更新日期: 2023-09-27 17:59:01

请注意,赏金是在询问这个问题的编辑部分。第一部分描述问题

我有一张桌子

Customer 
-----
Name
Address
SocialSecurity
Phone
Etc....

我还有一张叫的桌子

Permissions     
-----
IdOfUser
Can_C_Address
Can_R_Address
Can_U_Address
Can_D_Address
Can_C_Phone
Can_R_Phone
Can_U_Phone
Can_D_Phone
Etc...

注意CRUD代表创建、读取、更新和删除

如何确保在服务器端用户将数据库查询为:

contex.Customers.ToList();

假装向wcf数据服务发出请求的用户没有查看社会保障的权限我希望该列表返回null社会保障号码。我该怎么做

将每个属性/tableColumn分离成不同的实体需要做大量工作。例如,将CustomerPhone、CustomerSocial等都作为不同的实体


----------------------------------------编辑--------------------------------------

我找到了一个奇怪的解决方案!不过我不知道它是否安全。这是:

假设我有一个名为Users的实体。用户有电话号码、社会保障、地址等。例如,当有人查询数据库时,我想隐藏社会保障为了解决这个问题,我创建了一个与实体同名的操作/方法换句话说,我添加了方法:

[WebGet]
public IEnumerable<Data.Sub.User> Users()
{
    return this.CurrentDataSource.Users.ToList().Select(x => { x.SocialSecurity = ""; return x; });
}

然后在我的客户端,当我这样做时:

var context = new Data.DatabaseReference.MyEntity(); 
context.Users.ToList();  // WHEN I INVOKE THAT METHOD I SEE THAT I NEVER GET SOCIAL SECURITY!

采取这种方法安全吗

WCF数据服务对单个表列的权限,而不是对整个实体的权限

您有四个选项,但没有一个会很有趣。

1) 如果您正在使用反射提供程序,请在根查询处处理安全性。如果它需要是动态的,您可能最终会使用ExpressionTrees来进行投影。

2) 创建自定义数据服务提供程序-http://blogs.msdn.com/b/alexj/archive/2010/01/07/data-service-providers-getting-started.aspx如果您使用的是实体框架,您还需要修改表达式树,并删除它们在使用自定义提供程序时添加的所有空投影。这不适合胆小的人。

3) 拦截IQueryable并使用ExpressionVisitor删除或替换任何不应该投影的属性。例如,关于如何拦截查询,您可以在此处查看需要做什么来包装IQueryablehttp://blogs.msdn.com/b/vitek/archive/2012/01/07/projections-in-custom-providers-simple-solution.aspx.微软有一个关于如何拦截IQueryable并用属性替换所有常量的博客,这样EF就会发送很好的参数,但我现在找不到。

4) 从WCF数据服务切换到Web API,在那里您有更多的控制。无论如何,这是他们推荐的博客http://blogs.msdn.com/b/odatateam/archive/2014/03/27/future-direction-of-wcf-data-services.aspx

如果你只是想为阅读原文而这样做的话。此外,#2并没有真正涉及CRUD的创建、更新和删除部分。

  • 更新对于选项#3,你可以在我的博客上阅读如何做到这一点http://code.msdn.microsoft.com/Entity-Framework-a958cffb/sourcecode?fileId=95130&路径Id=263687793