Ich muss Code schreiben, um eine ID in meiner Datenbank eines Projekts zu finden. Benutzer sind mit einem Projekt verbunden, und alle Projekte haben viele Verbindungen zu anderen Objekten, z. B. zu Sitzungen.Parameter von URL im Controller-Konstruktor erhalten
Jetzt muss ich vor dem Ausführen von Aktionen prüfen, ob der Benutzer, der versucht, auf die Sitzung zuzugreifen, mit demselben Projekt verbunden ist, mit dem die Sitzung verbunden ist.
Dazu möchte ich ein [Attribut] auf die Aktionen verwenden. MVC: creating a custom [AuthorizeAttribute] which takes parameters?
Diese Frage und Antwort hat mich begonnen, aber ich habe Probleme mit dem Konstruktor des Controllers mit meinem Project ID
das Ziel zu bekommen, ist, dass ich in jedem Konstruktor einige Code zu schreiben, alle meine Controller von Objekten abhängig von den Projekten, finden Sie die Projekt-ID, und machen Sie es zugänglich (öffentlich), so dass meine [customauthorize]
Zugriff auf diese Projekt-ID haben, um zu überprüfen, ob der Benutzer Zugriff hat oder nicht.
Mein Problem:
public class SessionController : Controller {
NASDataContext _db = new NASDataContext();
public SessionController() {
var test = RouteData;
var ses = _db.Sessies.First(q=>q.Ses_ID==1);
}
Wie greife ich auf meine Routedata? RouteData
ist null, HttpContext
ist null und Request
ist null.
Ich brauche die ID in der URL, die in der Routedata ist ...
in der Prüfung Modell. Das ist ein interessanter Ansatz. Wie würde man das machen? Hast du einen Vortrag/Beispiele? Würde ich eine Erweiterungsmethode für das Modell schreiben, oder würde ich, wie bei einer Edit Action GET-Anfrage, den LINQ-Code ändern, der das Objekt erhält, und den Filter dort hinzufügen, was dazu führen wird, dass das Element nicht gefunden wird und benötigt wird einige zusätzliche Prüfungen für eine korrekte Fehlermeldung. – Stefanvds
Es kommt wirklich darauf an, wie das Model implementiert ist. Wenn Sie in Ihren Controller-Aktionen nur auf Linq to SQL zugreifen, haben Sie zwei grundlegende Ansätze und einen Architekturansatz. Der erste macht meinen Rat, und hier würden Sie jede Instanz Ihres Codes ändern, der auf ein Objekt zugreift, für das es eine Zugriffskontrolle gibt. Die zweite besteht darin, die Tatsache zu verwenden, dass L2S-Objekte als partiell generiert werden, und die Überprüfung in das Projekt-Objekt einzufügen. Die letzte ist die beste IMHO, implementieren Sie das Repository-Muster und legen Sie die Überprüfung in das Repository.Viel sauberer, testbarer und wartbarer. – Lazarus
Haben Sie Beispiele für diese zweite Option? Ich habe einige Objekte, die 4lvls tief im 'Baum' sind, der bei Projekten anfängt. Auch unterschiedliche Rollen sind unterschiedlich an ein Projekt gekoppelt. Also, wenn ich Option 2 richtig bekomme, würde man eine Methode hinzufügen, die den aktuellen Benutzer als Parameter nehmen und einen Bool zurückgeben würde, zugänglich oder nicht? Wenn ich diesen Code habe (Modul ist Kind von Project) var mod = _db.Modules.First (m => m.Mod_ID == id); Ich würde dann mod.Project.IsAccessible (Benutzer) aufrufen? Ist das die Art, wie du arbeitest? :) – Stefanvds