ActionFilterAttribute, gelten für Aktionen eines bestimmten controller-Typ
Ich bin mit einem ActionFilterAttribute zu tun, die benutzerdefinierte Authentifizierung Logik. Das Attribut wird nur verwendet werden, auf einer abgeleiteten Controller-Klasse, die enthält meine Authentifizierung Logik.
Hier mein Controller, abgeleitet von meinem custom controller-Klasse, und eine Beispiel-Eigenschaft:
public class MyController : CustomControllerBase
{
[CustomAuthorize(UserType = UserTypes.Admin)]
public ActionResult DoSomethingSecure()
{
return View();
}
}
Hier ist ein Beispiel meiner ActionFilterAttribute:
public class CustomAuthorizeAttribute : ActionFilterAttribute
{
public MyUserTypes UserType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
myUser user = ((CustomControllerBase)filterContext.Controller).User;
if(!user.isAuthenticated)
{
filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
}
}
}
Funktioniert Super.
Hier ist die Frage: Kann ich verlangen, dass dieses Attribut NUR verwendet werden, auf Aktionen, auf meiner eigenen controller-Typ?
Ihr Attribut ist gebrochen, weil es keine Erben aus AuthroizeAttribute und somit ist nicht garantiert ausgeführt, wenn die Aktion gespeichert ist. Siehe blogs.teamb.com/craigstuntz/2009/09/09/38390, die Lösungen für die Arbeit mit caching.
Warum sollte das Ergebnis einer Aktion zwischengespeichert werden?
Es würde zwischengespeichert werden, weil jemand gesagt, es zwischengespeichert werden. Stell dir vor, jemand legt die Cache-Attribut in einer parent-Klasse, nicht zu bemerken, die gebrochen Attribut des Subtyps. Es ist eine weitaus bessere Idee, ein Attribut verwenden, das ist nicht grundsätzlich unvereinbar mit ASP.NET/MVC -caching. Siehe den link oben für weitere Optionen.
Guten Fang. Ich nicht wirklich ein Blick auf die action-filter selbst. Er ist richtig, wenn Sie schreiben Sie Ihre eigene Autorisierungs-action filter, die Sie wirklich Erben sollte aus AuthorizeAttribute. Dann können Sie das überschreiben der AuthorizeCore() protected-Methode.
Muss einige Klarstellungen zu diesem Thema hier stackoverflow.com/questions/1441799/...
Warum sollte das Ergebnis einer Aktion zwischengespeichert werden?
Es würde zwischengespeichert werden, weil jemand gesagt, es zwischengespeichert werden. Stell dir vor, jemand legt die Cache-Attribut in einer parent-Klasse, nicht zu bemerken, die gebrochen Attribut des Subtyps. Es ist eine weitaus bessere Idee, ein Attribut verwenden, das ist nicht grundsätzlich unvereinbar mit ASP.NET/MVC -caching. Siehe den link oben für weitere Optionen.
Guten Fang. Ich nicht wirklich ein Blick auf die action-filter selbst. Er ist richtig, wenn Sie schreiben Sie Ihre eigene Autorisierungs-action filter, die Sie wirklich Erben sollte aus AuthorizeAttribute. Dann können Sie das überschreiben der AuthorizeCore() protected-Methode.
Muss einige Klarstellungen zu diesem Thema hier stackoverflow.com/questions/1441799/...
InformationsquelleAutor Peter J | 2009-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die ActionFilter für die Klasse selbst. Alle Aktionen in der Klasse erkennen, die ActionFilter.
InformationsquelleAutor Jarrett Meyer
Basierend auf die Kommentare und die Einschränkungen meines Systems, habe ich einen hybrid-Ansatz. Grundsätzlich, wenn die Anfrage kommt, werden über eine Cache-route oder die "Benutzer" nicht gesetzt ist, aus irgendeinem Grund schlägt die Authentifizierung fehl, in der richtigen Weise.
Im Fall der IsAjaxRequest fließt, wird der user nicht umgeleitet werden, so dass die Methode immer noch zurückgeben muss.
+1 für die Verwendung AuthorizeAttribute statt ActionFilterAttribute. Löst das problem, dass die controller-Aktion, hat die CustomAuthotize Attribut ausgeführt wird, selbst wenn wir noch nicht angemeldet sind, die andere Probleme verursachen.
InformationsquelleAutor Peter J