2013-05-11 69 views
0

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

我不知道如何(通过在响应或将它们分配给不同的DTO之前将属性置为无效)以及我应该在哪里处理这些场景(在用于特定于用户或控制器的DTO中添加方法)。

在此先感谢。

+1

对于第二个问题,您可以将用户对象设置为虚拟。这样可以延迟加载,因此除非直接访问属性,否则不应拖动属性。 – DSlagle 2013-05-11 19:18:47

回答

0

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

0

返回DTO而不是EF实体类通常更好。它增加了一个抽象,所以你永远不会(无意中)公开暴露你不想公开的属性。 (想想如果您稍后添加敏感属性会发生什么)。所以我一定会退回BookMarkDto s。您可以通过所有公共书签和登录用户自己的书签的联合来构建返回的集合。 (一个联合是一个隐含的区别)。因此,没有人会看到别人的私人书签。

相关问题