2015-10-01 5 views
5

मेरे पास कुछ संस्थाएं हैं जिनमें डेटा है जो केवल कुछ उपयोगकर्ताओं के लिए सुलभ होना चाहिए।संपत्ति पर प्रति उपयोगकर्ता सुरक्षा के लिए WebApi OData

public class Foo 
{ 
    public virtual Bar { get; set; } 
    ... 
} 

public class Bar 
{ 
    public string Secret { get; set; } 
    ... 
} 

उदाहरण Bar.Secret के लिए केवल UserA लेकिन UserB द्वारा नहीं द्वारा सुलभ होना चाहिए। मैं कर सकता तो कुछ इस तरह:

public class BarsController : ODataController 
{ 
    [EnableQuery] 
    public IHttpActionResult Get() 
    { 
     if (User.Identity.Name != "UserA") 
      return Unauthorized(); 

     return _db.Bars(); 
    } 
} 

कि एक बुरा कार्यान्वयन होने के अलावा। यह इस नियंत्रक को कवर नहीं करता:

public class FoosController : ODataController 
{ 
    [EnableQuery] 
    public IHttpActionResult Get() 
    { 
     return _db.Foos(); 
    } 
} 

कौन सा /odata/Foos?$expand=Bars साथ कहा जा सकता है और उसके बाद मैं Bar.Secret देख सकते हैं। मैं Foo पर $expand को अक्षम नहीं कर सकता क्योंकि यह क्वेरी UserA के लिए पूरी तरह से कानूनी है और इसकी भी आवश्यकता है।

क्या ओडाटा अनुरोध करने वाली संस्थाओं में शामिल कुछ भविष्यवाणियों के खिलाफ प्रश्नों को सत्यापित करने का कोई तरीका है।

कुछ

तरह
public class SecureEnableQueryAttribute : EnableQueryAttribute 
{ 
    public bool ValidateResult(IEnumerable<T> entities) 
    { 
     return entities.All(x => x.Secret == UserA.Secret); 
    } 
} 

उत्तर

0

आप क्वेरी विकल्प से पहले क्वेरी निष्पादित किया जाता है मान्य हैं और असफल हो उपयोगकर्ता का अनुरोध किया डेटा पुनः प्राप्त करने के लिए अधिकृत नहीं किया गया है सकते हैं। ऐसा करने के लिए, EnableQueryAttribute से प्राप्त करें और ValidateQuery ओवरराइड करें।

public class SecureEnableQueryAttribute : EnableQueryAttribute 
{ 
    public virtual void ValidateQuery(HttpRequestMessage request, ODataQueryOptions queryOptions) 
    { 
     base.ValidateQuery(request, queryOptions); 

     // Insert custom logic, possibly looking at queryOptions.SelectExpand 
     // or queryOptions.RawValues. 
    } 
} 
संबंधित मुद्दे