2014-02-25 39 views
0

我有一個WebApi 2.1 OData(V 5.1.1)服務支持實體框架6.1。我試圖從安全角度鎖定它,以便用戶只能查詢他們的數據。我有一切正常工作,直到你到$ expandnds選項。

爲了討論起見,考慮以下簡單數據模型:

public class Scenario 
{ 
    public Guid Id { get; set; } 
    public Guid CreatedById { get; set; } 
} 

public class Property 
{ 
    public Guid Id { get; set } 
    public Guid CreatedById { get; set; } 
    public IQueryable<Scenario> Scenarios { get; set; } 
} 

當我打電話/Properties(guid'SOMEGUID')?$expand=Scenarios,我需要能夠確保只有在返回CreatedById = CurrentUserId方案。這需要發生在服務器端上,而不是在客戶端查詢中。

WCF Data Services有處理這種情況的QueryInterceptors ... WebApi 2.1 OData中的等價物是什麼?

謝謝!

回答

1

這裏是你如何可以實現這個對自己有一個樣品要點: https://gist.github.com/anonymous/9237151

根據我的混帳,你可以使用類似的驗證和實施上CanAcess方法或類似的驗證邏輯。讓我知道這是否有助於你。

我們將很快就http://aspnet.codeplex.com

+0

謝謝哈維爾,你這麼多。 EDM 5.6.1庫中是否存在與IEdmNavigationSource等效的內容?或者我可以只使用IEdmNamedElement? – AdvancedREI

+0

Javier,你有辦法能夠使用這種技術來限制返回的數據,其中屬性等於特定值嗎? (相當於左外連接?) – AdvancedREI

-1

的官方樣片有兩種方法來解決你的問題,如果我理解正確你的問題。

  1. 呼叫ODataQueryOptions對IQueryable的結果ApplyTo方法
    public IQueryable<Property> Get(ODataQueryOptions queryOptions) { .... return queryOptions.ApplyTo(properties); }

  2. 添加屬性可查詢的GetData方法,讓的WebAPI處理查詢選項
    [Queryable] public IQueryable<Property> Get() { ... return properties; }

+0

這不是我要找的,我已經可以獲得查詢並應用選項。我需要能夠限制跨導航屬性的相關數據,Javier的答案是正確的。 – AdvancedREI