2012-10-26 35 views
2

使用實體框架保護數據的選項/解決方案有哪些?使用實體框架的數據安全

我不談論表單登錄和這裏,只是假設用戶認證與否。

爲了說明,我附上了我的一個web api控制器,我想知道這是否是這樣做的。我問的原因是,我想知道是否有更簡單的方法來完成這項工作,而不是寫所有這些邏輯到在我的所有控制器中公開哪些數據。

此外,當查看像breezejs和odata這樣的系統時,我可以將$ expand = TrafficImages添加到我的查詢中,但我不希望用戶能夠獲取我的洞數據庫。

所以總結一下,有哪些方法可以保護暴露的數據,例如用戶無法下載合理的數據。

[AllowAnonymous] 
public object GetTheoryTests() 
{ 
    var identity = ((ClaimsIdentity)((ClaimsPrincipal)HttpContext.Current.User).Identity); 
    //if (HttpContext.Current.User.Identity.IsAuthenticated) 


    if (!identity.IsAuthenticated) 
    return db.TheoryTests.Include(t=>t.TrafficImages).Where(t=>t.PublicAvalible) 
      .Select(t => new { Id = t.Id, Title = t.Title, Images = t.TrafficImages }).AsEnumerable(); 

    if (User.IsInRole("WebAdmins")) 
     return db.TheoryTests.AsEnumerable(); 

    var key = identity.GetProvider(); 

    var member = db.Members.Include(m=>m.PayedTheoryTests).SingleOrDefault(m=>m.Identities.Any(
     i=>i.identityprovider == key.provider && 
     i.nameidentifier == key.id)); 
     if(member!=null) 
      return db.TheoryTests.Include(t => t.TrafficImages).Where(t => t.PublicAvalible).Select(t => new { Id = t.Id, Title = t.Title, Images = t.TrafficImages }).AsEnumerable(); 
     else 
      return db.TheoryTests.Include(t => t.TrafficImages).Where(t => t.PublicAvalible) 
       .Union(member.PayedTheoryTests).Select(t => new { Id = t.Id, Title = t.Title, Images = t.TrafficImages }).AsEnumerable(); 



} 

在想着它,我懷念的是像取決於用戶的狀態我的數據庫的視圖模型聯塔辦事處。這是否會成爲在同一個數據庫的頂部創建兩個實體框架的解決方案,一個用於有限的數據顯示,另一個用於更高級的操作?

回答

3

同時,在QueryInterceptors到達之前,您應該採取其他步驟。首先,您應該研究保護Web API控制器或方法的技術,這個主題超出了本答案的範圍。

其次,w/r/t $ expand,你對這個功能很謹慎。您可能想要檢查某些控制器方法要求哪些擴展和/或不允許其他擴展。

幸運的是,這樣做相對容易。您可以訪問請求查詢字符串。您可以檢測該字符串中是否存在「$ expand」,並分析它是否允許某些擴展並禁止其他字符串。

Breeze將來會爲此添加助手。到那時你必須處理字符串。

如果您願意,您可能希望爲此創建自己的操作過濾器。

2

偉大的問題!我們目前正在研究稱爲QueryInterceptors的東西,它允許您檢查並可能更改或拒絕提交給服務器的查詢。 「Principal」將是每個QueryInterceptor方法中的可用上下文對象。請在「微風」網站www.breezejs.com上投票選擇此功能。