如何根据请求者限制对实体的某些属性的访问

时间:2013-05-11 19:13:23

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

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

我已经阅读了很多关于web api的身份验证和授权的信息。我不清楚的部分是如何防止访问某个实体的特定属性,具体取决于谁试图访问该属性。

e.g。假设我的模型有一个书签实体 - 实体将如下所示:

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)我注意到当我从bookController返回一组书签时,因为Bookmark中有User属性,它还返回User的属性 - 包括我不想分享的信息 - 比如地址。

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

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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