Wir verwenden LINQ to Entities, um Einträge in eine Audit-Datenbank (SQL Server 2008) zu schreiben. Da es sich um eine dedizierte Audit-Datenbank handelt, fügen wir nur Zeilen ein - wir lesen niemals Zeilen, aktualisieren oder löschen sie aus der Überwachungsanwendung.
Die Auditing-Anwendung sollte das Prinzip der geringsten Berechtigung verwenden, also möchten wir nicht mehr Berechtigungen erteilen, als sie benötigen. Da wir niemals Zeilen lesen, möchten wir keine Berechtigungen zur Auswahl aus der Datenbank gewähren.
Wenn wir jedoch versuchen, die Daten zu schreiben, erhalten wir folgende Fehlermeldung:
Die SELECT-Berechtigung wurde für das Objekt 'AuditEvent', Datenbank 'IdentifyAudit', Schema 'dbo' verweigert.
Der Code ist ziemlich Standard-EF-Code:
%Vor%Warum brauchen wir die SELECT-Berechtigung, um in die Tabelle zu schreiben, und noch wichtiger: Gibt es eine Möglichkeit, diese Anforderung zu entfernen?
BEARBEITEN
SQL Profiler zeigt, dass diese Anweisung ausgeführt wird:
%Vor%Dies erklärt, warum SELECT-Berechtigungen benötigt werden, da die Operation die automatisch generierte ID der eingefügten Zeile zurückgibt.
Jetzt bleibt die Frage: Ich muss die ID der Reihe, die ich gerade eingefügt habe, nicht wissen, also kann ich diese Funktion irgendwie ausschalten?
Standardmäßig ändert sich nach dem Hinzufügen einer Entität zum ObjectContext und dem Aufruf von SaveChanges der Status dieses Objekts von "Zu Unverändert" und wird weiterhin von ObjectContext verfolgt. Aus diesem Grund benötigt EF diese ID, um Änderungen daran verfolgen zu können.
Entity Keys und hinzugefügte Objekte:
1. Das Entitätsobjekt wird konstruiert. An diesem Punkt die Schlüsseleigenschaften alle habe Standardwerte, entweder Null oder 0.
2. Das neue Objekt wird dem hinzugefügt ObjectContext entweder durch Aufruf AddObject oder eine der Entitäten Set-spezifische Add-Methoden in der Kontext oder durch den Aufruf von Add auf a Navigationseigenschaft, die ein zurückgibt EntityCollection.
An diesem Punkt, Objektdienste generiert einen temporären Schlüssel, der ist verwendet, um die Objekte in der ObjectStateManager.
3.SaveChanges wird am aufgerufen ObjectContext.
Eine INSERT-Anweisung wird von generiert Entity Services und wird auf der Datenquelle.
4.Wenn die INSERT-Operation erfolgreich ist, Servergenerierte Werte werden geschrieben zurück zum ObjectStateEntry.
5.Der ObjectStateEntry aktualisiert die Objekt mit dem Server generiert Wert.
6.Wenn AcceptChanges auf dem aufgerufen wird ObjectStateEntry, eine permanente EntityKey wird mit dem neuen berechnet Server-generierte Werte.
Soweit ich weiß, ist es nicht möglich, diese Funktion von ObjectContext zu wechseln, und ich sehe keine "nette" Lösung für dieses Problem: Eine Möglichkeit, dies zu vermeiden, ist die Verwendung Ihrer eigenen gespeicherten Prozeduren Einfügen von Entitäten (wenn möglich) ( Ссылка ).
Wenn es keine vom Server generierten IDs gibt, denke ich, dass select query nicht ausgeführt wird (wiederum, wenn Sie dbs ändern können und wenn Sie sich mit der Generierung von IDs beschäftigen wollen).
Aber das ist eine alte Frage, aber für die Zukunft wird vielleicht irgendjemand benutzen. Eine Möglichkeit besteht darin, eine Auswahlberechtigung nur für ID-Felder zu erteilen.
Tags und Links .net entity-framework security linq-to-entities least-privilege