Exclude-Eigenschaft von WebApi OData (EF) Reaktion in c#
Arbeite ich mit einem WebApi-Projekt in C# (EF code first) und ich bin mit OData.
Ich habe eine "User" - Modell mit Id, Name, Nachname, E-Mail und Passwort.
Im controller zum Beispiel habe ich diesen code:
//GET: odata/Users
[EnableQuery]
public IQueryable<User> GetUsers()
{
return db.Users;
}
Wenn ich rufe /odata/user ich werde all die Daten: Id, Name, Nachname, E-Mail und Passwort.
Wie kann ich ausschließen das Passwort von Ergebnisse, aber halten im controller zu machen Linq-Abfragen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin ein wenig spät zu dem Thema, aber ich denke, das könnte dir helfen.
Ich gehe davon aus, dass Sie wollen, um das Kennwort zu verschlüsseln, die für storage-Zwecke. Haben Sie sah über einen odata-Aktion das Kennwort festlegen? Mit einer Aktion können Sie ignorieren die password-Eigenschaft, die Sie beim einrichten Ihrer Einheiten, während immer noch das aussetzen einer sauberen Weg, um die end-Benutzer, um das Kennwort zu aktualisieren.
Erstens: ignorieren Sie die password-Eigenschaft
zweite: fügen Sie Ihre odata-Aktion
Dann fügen Sie die SetPassword-Methode, um Ihre UserInfoController.
User
im controller und nicht extraUserInfo
- mapping-Klasse. Mit dieser Lösung können Sie. DropUserInfo
und setzenUser
direkt. Dann gilt @RickWillis Lösung auf dieUser
Person, dadurch wird das Passwort nicht ausgesetzt werden, die in den OData-Nutzlast.Ist es vielleicht ein wenig spät, aber eine elegante Lösung wäre das hinzufügen eines benutzerdefinierten QueryableSelectAttribute und dann einfach die Liste der Felder, die Sie auswählen möchten, die auf der Aufschlag-Seite. In deinem Fall wird es so Aussehen:
Und in der Steuerung fügen Sie einfach das Attribut mit den gewünschten Eigenschaften:
... Und das ist es!
Natürlich das gleiche Prinzip kann auch angewendet werden für eine benutzerdefinierte
QueryableExpandAttribute
.Hinzufügen [NotMapped] - Attribut auf die Password-Eigenschaft in der User-Klasse wie folgt:
Ignorieren. Von Sicherheitsempfehlungen für ASP.NET Web-API OData-2:
Was Sie tun müssen, ist eine odata controller gibt eine projizierte Teilmenge der ursprünglichen Einheit.
... dann haben zwei Odata-Controllern einen für FulLData, eine für SubsetData (mit unterschiedlichen Sicherheitseinstellungen),
Sie bereits versucht, dies?
Aktualisieren Sie einfach die Eigenschaft.
Können wir nutzen, die ConventionModelBuilder und verwenden DataContract/DataMember explizit aktivieren-Eigenschaften werden in der EdmModel.
Beachten Sie, dass dies keinen Einfluss auf die Entity Framework-Modell, da wir nicht mit der [NotMapped] - Attribut (es sei denn, Sie wollen es nicht in entweder-Modell)
Dies hat den Vorteil, dass alle mapping-Logik an einer Stelle in Ihrem Projekt
Machte ich ein Handwerk und vorübergehende Lösung für dieses problem (ist nicht die beste Lösung, da UserInfo ist nicht eine Entität geben, und nicht $select und $expand).
Ich erstellte ein neues Modell namens UserInfo nur mit den Eigenschaften die ich brauche (abgesehen von der Benutzer):
Dann änderte ich die Methode im controller:
Können Sie erstellen, die neue Ansicht in der DB nur die Daten, die Sie benötigen. Legen Sie dann EntitySetRights.Keine für Benutzer-Tabelle und erstellen die benötigten Beziehungen für die erstellte Ansicht.
Jetzt können Sie tun, gemeinsame odata-requests (GET odata/UsersFromView) und bekommen die Benutzer Daten ohne Passwort. Post-Anforderung, die Sie tun können, mithilfe von Benutzer-Tabelle.
Nichts anderes für mich gearbeitet, so ist hier eine elegante Lösung.
Verwenden Sie die
HideSensitiveProperties()
Erweiterung Methode in IhrerTableController
wie diese.Aber dies wird nicht entfernen Sie die Eigenschaft name von der Reaktion, aber es wird seinen Wert zu
null
.Hier
ModelBase
ist die Basisklasse für alle DTOs.Sollten Sie keine Abfrage von Domain-Modell direkt in den controller. Erstellen Sie stattdessen eine QueryModel DTO ordnet dem Domain-Modell.
Lesen Sie mehr über diese Konzepte in DDD und CQRS
verwenden Automapper