Frage

Ich habe mich gefragt, ob/wie ich das Standardverhalten in ASP.NET MVC überschreiben kann. Ich weiß, dass ich einen neuen Aktionsfilter erstellen kann, mein eigenes Attribut usw. erstellen kann. Ich bin lediglich interessiert, wenn ich einfach das [autorisierende] Verhalten ändern und seine Arbeit durch meinen eigenen Code ersetzen kann?

Bearbeiten: Jungs und Mädels. Ich schätze Ihre Eingabe, aber wie ich schrieb, bin ich es nicht Ich möchte ein neues [xyzAuthorize] -Matchribut vorstellen. Mir ist bewusst, wie das geht. Ich möchte die [autorisierende] Notation behalten, aber nur ändern, wie es funktioniert.

War es hilfreich?

Lösung

Ja, werfen Sie einen Blick auf die MSDN -Dokumente für AutorizeAttribute: http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx.

Grundsätzlich können Sie die OnAuthorization () -Methode () überschreiben und das Verhalten anpassen. Es gibt auch andere virtuelle Methoden im Attribut.

Bearbeiten: Wie Bruno betonte, können Sie die Autorizecore () -Methode überschreiben. Der Hauptunterschied besteht darin, dass AuthorizeCore () eine httpcontextbase nimmt, während die OnAuthorisierung () einen Autorisierungscontext übernimmt. Eine Instanz des Autorisierungscontext liefert Ihnen weitere Informationen wie den Controller, den RequestContext und den Routedata. Sie können auch einen ActionResult angeben.

AutorizeCore () ist in den Informationen, auf die Sie zugreifen können, sowie das Ergebnis, das Sie zurückgeben können, eingeschränkt. Wenn Sie jedoch zwischengespeicherte Daten autorisieren müssen, muss Ihre Logik den Fall verarbeiten, in dem Sie keine dieser zusätzlichen Daten haben (zusätzliche Daten da Daten aus dem Cache bedient werden, bevor die Anforderung über die MVC -Pipeline geleitet wird).

Wie immer müssen Sie Ihr Szenario und die verfügbaren Werkzeuge und Kompromisse zwischen ihnen verstehen.

Andere Tipps

Sie können den AutorizeAttribute -Filter unterkressen und Ihre eigene Logik in ihn einfügen.

Lassen Sie uns ein Beispiel sehen. Angenommen, Sie möchten immer lokale Verbindungen genehmigen. Wenn es sich jedoch um eine Remote -Verbindung handelt, möchten Sie die übliche Autorisierungslogik beibehalten.

Sie könnten so etwas tun wie:

public class LocalPermittedAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return (httpContext.Request.IsLocal || base.AuthorizeCore(httpContext)));
        }
}

Oder Sie können immer eine bestimmte Remoteadresse (zum Beispiel Ihre Maschine) autorisieren.

Das ist es!

Bearbeiten: Vergessen zu erwähnen, Sie werden es genauso verwenden, wie Sie den AutorizeAttribute -Filter verwenden würden:

class MyController : Controller
{
    [LocalPermittedAuthorize]
    public ActionResult Fire()
    {
        Missile.Fire(Datetime.Now);
    }
}

Implementieren Sie Ihren eigenen Rollenanbieter und legen Sie Ihre App fest, um sie zu verwenden. Dann respektiert das Autorize -Attribut Ihren Athorisierungscode.

Ich sehe nur 2 Wege: Überschreiben AuthorizeAttribute.OnAuthorization Methode oder erstellen Sie Ihr eigenes autorisiertes Attribut von Grund auf neu.

1) Sehr einfach:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        /// your behavior here
    }
}

2) Einfach - schauen Sie sich einfach ASP.NET MVC -Quelle an, AutorizeAttribute.cs Datei

Es scheint, dass Sie einen benutzerdefinierten Filter wie gewohnt implementieren können (und AutorizeAttribute, wenn Sie möchten) und dann einen neuen Aktionsinvoker erstellen, der erbt ControllerActionInvoker und überschreibt GetFilters. In GetFilters rufen Sie an base.GetFilters() Um die Liste der Filter zu erhalten, iterieren Sie die Iterate über die Autorisierungsfilter und ersetzen Sie Anrufe, um FILTER mit Anrufen Ihres benutzerdefinierten Filters zu autorisieren.

Ein weiterer potenzieller Weg besteht darin, eine benutzerdefinierte Mitgliedschaft und Rollenanbieter zu implementieren, je nachdem, was Sie versuchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top