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);
}
}