2009-08-06 7 views
0

Angenommen, ich möchte nicht Mitgliedschaft verwenden und Benutzerzugriff mit ActionFilter einschränken möchten.Überprüfen Sie die Benutzerdetails in ASP.NET MVC ActionFilter

Ich weiß, ich kann ein Filter/Attribut erstellen und überschreiben die OnActionExecuting-Methode und weiter kann ich dieses Attribut in ein ActionResult setzen.

Und nehmen wir an, ich habe eine Tabelle mit dem Namen 'tbUsers', es hat auch ein int-Feld namens 'Zertifikat' und abhängig von diesem 'Zertifikat' kann ein Benutzer auf ein ActionResult zugreifen oder nicht.

Aber wie kann ich in einem OnActionExecuting-Verfahren den 'certificate'-Wert dieses Benutzers überprüfen und seinen Zugriff auf eine' NotAllowed.aspx'-Seite gewähren?

Danke !!!

Antwort

1

Der ActionExecutingContext hat den HttpContext, der das aktuelle Benutzerobjekt enthalten würde. Sie können dies verwenden, um den Benutzer zu erhalten. Sie können damit auch auf die Sitzung zugreifen, wenn Sie die Informationen in der Sitzung speichern möchten. Sie können es auch in einen verschlüsselten Cookie einfügen und über die Request.Cookies auf den Kontext zugreifen. Sie sollten über die Sicherheitsimplikationen nachdenken, obwohl ich es nicht als problematischer als das Authentifizierungs-Cookie erachte.

Es ist ein wenig komplizierter, es mit der Datenbank zu vergleichen und die Testbarkeit auf Ihrem Filter beizubehalten. Was ich getan habe, ist, zwei Konstruktoren für jede Filterklasse bereitzustellen. One stellt eine Datenbankfactory zur Verfügung, die meinen Datenkontext erstellt. Ich benutze dies beim Testen und stelle eine Pseudo-Datenbank-Fabrik zur Verfügung, die eine gefälschte oder gefälschte Datenbank erzeugt. Der normale, parameterlose Konstruktor ruft den vorherigen Konstruktor mit einer Null-Factory auf. Wenn dies geschieht, erstellt der andere Konstruktor eine neue Instanz der Standardfactory.

private IDatabaseFactory Factory { get; set; } 
public MyFilter(IDatabaseFactory factory) 
{ 
    this.Factory = factory ?? new DefaultDatabaseFactory(); 
} 

public MyFilter() : this(null) { } 
4

würde ich es auf diese Weise nicht tun. Ich würde ein IAuthorizationFilter implementieren. Autorisierungsfilter werden vor allen Aktionsfiltern ausgeführt.

Angenommen, Sie fügen später ein OutputCache-Attribut für die Aktionsmethode ein, das vor dem Authentifizierungsfilter ausgeführt wird. Das wäre schlecht! Wenn der Inhalt zwischengespeichert wird, würde der Authentifizierungsfilter niemals ausgeführt werden und die Benutzer würden zwischengespeicherte vertrauliche Daten sehen.

Verwandte Themen