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

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

我有一张桌子

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社会安全号码。 我怎样才能做到这一点?

将每个property / tableColumn分隔成一个不同的实体需要做很多工作。 例如,将CustomerPhone,CustomerSocial等全部作为不同的实体。


—————————————-编辑——— —————————–

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

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

 [WebGet] public IEnumerable 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! 

采取这种方法是否安全?

你有四个选择,但没有一个会很有趣。

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

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

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

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

那就是如果你只是想把它读成crud。 除了没有真正触及CRUD的创建,更新和删除部分的#2。

  • 更新对于选项#3,您可以在我的博客上阅读如何操作http://code.msdn.microsoft.com/Entity-Framework-a958cffb/sourcecode?fileId=95130&pathId=263687793