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

时间:2014-04-18 21:58:52

标签: c# linq wcf-data-services queryinterceptor

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

我有一张桌子

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<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!

采用这种方法是否安全?

1 个答案:

答案 0 :(得分:1)

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

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

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

3)拦截IQueryable并使用ExpressionVisitor删除或替换不应投射的任何属性。例如,如何拦截查询,您可以在此处看到您需要执行的操作{IQ {3}}。有一个关于如何拦截IQueryable的Microsoft博客,并用属性替换所有常量,因此EF会发送好的参数,但我现在无法找到它。

4)从WCF数据服务切换到您有更多控制权的Web API。从这个博客开始他们推荐的是http://blogs.msdn.com/b/vitek/archive/2012/01/07/projections-in-custom-providers-simple-solution.aspx

如果您只是想为读取内容而执行此操作。除了#2之外,它并没有真正触及CRUD的创建,更新和删除部分。