2013-05-11 87 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。您可以通過所有公共書籤和登錄用戶自己的書籤的聯合來構建返回的集合。 (一個聯合是一個隱含的區別)。因此,沒有人會看到別人的私人書籤。

相關問題