【问题标题】:how to restrict access to certain properties of an entity based on the requester如何根据请求者限制对实体某些属性的访问
【发布时间】:2013-05-12 17:16:43
【问题描述】:

我是 MVC 新手,正在为移动应用程序构建 Web api。我正在使用 asp.net web api 和实体框架。

我已经阅读了很多关于 web api 的身份验证和授权的内容。我不清楚的部分是如何根据谁试图访问该属性来防止访问实体的特定属性。

例如假设我的模型有一个书签实体 - 该实体如下所示:

public class Bookmark
{
    public long ID { get; set; }
    public User Owner { get; set; }
    public Boolean IsPublic { get; set; }
}

public class User
{
    public string UserID { get; set; }
    public DateTime DateJoined { get; set; }
    public string Address {get;set;}
    public virtual ICollection<Bookmark> Bookmarks { get; set; }
}

我有两个问题。

1) 虽然任何人都应该能够访问 ../mysite/username/bookmarks,但如果是另一个人请求另一个人的书签,那么我只会返回公共书签。这个逻辑应该在哪里?我相信,这个业务逻辑应该在模型中。那么我应该创建另一组像 DTO 这样的类来处理这个业务逻辑吗?我还没有看到任何将此类方法添加到实体框架类本身的示例。

2) 我注意到,当我从一个书签控制器返回一组书签时,因为 Bookmark 中有一个用户属性,它还返回用户的属性——包括我不想分享的信息——比如地址。

我不确定如何(通过在响应之前将属性清空或将它们分配给不同的 DTO)以及我应该在哪里处理这种情况(在特定于用例或控制器的 DTO 中添加方法)。

提前致谢。

【问题讨论】:

  • 对于第二个问题,您可以将用户对象设置为虚拟。这会启用延迟加载,因此除非您直接访问它们,否则不应拉取属性。

标签: entity-framework asp.net-mvc-4


【解决方案1】:

您应该检查是否是另一个人在请求另一个人的书签并将其传递给逻辑层。 (类似于:GetBookMatdData(int bookmarkID, bool isSamePerson)) 那么如果isSamePerson 为 False,你就知道不返回用户数据。

【讨论】:

    【解决方案2】:

    返回 DTO 而不是 EF 实体类通常更好。它添加了一个抽象,因此您永远不会(无意中)公开公开您不想公开的属性。 (想想如果您稍后添加敏感属性可能会发生什么)。

    所以我肯定会返回BookMarkDtos。您可以通过所有公共书签和登录用户自己的书签的联合来构建返回的集合。 (联合是隐含的不同)。因此,没有人会看到其他人的私人书签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2016-07-07
      相关资源
      最近更新 更多