2015-10-01 3 views
5

Ich habe einige Entitäten, die Daten haben, die nur für einige Benutzer zugänglich sein müssen.WebApi OData pro Benutzersicherheit auf Eigenschaft

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

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

Zum Beispiel Bar.Secret muss von UserA nur zugänglich sein, aber nicht von UserB. ich könnte so etwas wie diese:

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

     return _db.Bars(); 
    } 
} 

Abgesehen, dass eine schlechte Umsetzung zu sein. Es erstreckt sich nicht auf diesen Controller:

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

die mit /odata/Foos?$expand=Bars genannt werden könnte und dann konnte ich Bar.Secret sehen. Ich kann nicht einfach $expand auf Foo deaktivieren, weil diese Abfrage für UserA absolut legitim ist und auch benötigt wird.

Gibt es eine Möglichkeit, OData dazu zu bringen, die Abfragen für ein Prädikat zu validieren, das die angeforderten Entitäten enthält.

So etwas wie

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

Antwort

0

können Sie die Abfrage Optionen validieren vor die Abfrage ausgeführt wird und fehlschlagen, wenn der Benutzer nicht abgerufen werden, die angeforderten Daten autorisiert ist. Um dies zu tun, leiten Sie von EnableQueryAttribute und überschreiben 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. 
    } 
}