【问题标题】:WCF data service permission on individual table columns instead of on whole entities单个表列而不是整个实体的 WCF 数据服务权限
【发布时间】:2014-04-18 21:58:51
【问题描述】:

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

我有一张桌子

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 等都作为不同的实体。


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

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

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

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

采用这种方法是否安全?

【问题讨论】:

  • 我敢打赌,您可以制作一个使用反射的有点混乱的解决方案,但在这里发布作为答案会有点长。
  • 我已在此处stackoverflow.com/questions/23203482/… 发布了您的另一个 stackoverflow 问题,该问题适用于根实体,但不适用于导航属性。
  • 您使用的是什么提供商? EF 还是反射提供者?
  • 我已经启动并运行了解决方案,但是在堆栈溢出时发布所有代码有点大,我可能只是发布一般想法并在我的博客上发布更多代码。另外我需要清理它。我选择了#3。因为你不是唯一一个想要它的人,我什至在 WCF 数据服务进入维护模式之前就想要它。

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


【解决方案1】:

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

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

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

3) 拦截 IQueryable 并使用 ExpressionVisitor 删除或替换不应投影的任何属性。例如,关于如何拦截查询,您可以在http://blogs.msdn.com/b/vitek/archive/2012/01/07/projections-in-custom-providers-simple-solution.aspx 处查看您需要做什么包装 IQueryable。有一篇关于如何拦截 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 中阅读。除了 #2 并没有真正触及 CRUD 的创建、更新和删除部分。

【讨论】:

  • +1 感谢您的帮助!如果我现在找不到更好的东西,我可能会接受你的回答。
  • 如何处理根查询的安全性?
  • 如果您使用的是反射提供程序,这意味着您正在公开一个返回 IQueryable 类型的公共属性。在 getter 中,您需要添加逻辑来预测哪些属性应该为 null 并将其作为 IQueryable 返回。如果您希望它是动态的,您很可能会进入表达式树。表达式树一开始似乎很难,但一旦你使用它们,它们就不会那么糟糕了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多