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

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

提前致谢。

4

2 回答 2

0

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

于 2013-05-11T20:13:22.647 回答
0

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

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

于 2013-05-12T09:16:43.400 回答