6

Ich habe im ganzen Internet versucht, herauszufinden, warum mein benutzerdefiniertes AuthorizeAttribute in meinem MVC WebApi nicht funktioniert. Ich habe die Leute über diese Art der Sache auf SO fragen gesehen, aber nichts hat mir geholfen, doch mein Problem zu lösen:Benutzerdefiniertes AuthorizeAttribute, das nicht von MVC Framework aufgerufen wird

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, 
       Inherited = false)] 
    public sealed class CustomAuthorization : AuthorizeAttribute 
    { 

     //... 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      // custom auth logic, returns true if authorized, false otherwise 
     } 
    } 

ich von System.Web.Mvc bin erstreckt, wie zu System.Web.Http gegenüber. Jedoch wird mein AuthorizeCore(HttpContextBase httpContext) nie aufgerufen.

Ich habe einen Konstruktor in meiner CustomAuthorization Klasse, die ein params string[] nimmt, die die Namen meiner benutzerdefinierten Berechtigungen für eine bestimmte Aktion erforderlich sind, zum Beispiel:

[CustomAuthorization("Some Permission")] 
[System.Web.Http.HttpGet] 
public CustomResponse SomeAction() 
{ 
    //... 
} 

Was ich hoffe, zu erreichen ist meine Genehmigung haben, Der Code wird ausgelöst, wenn eine Anfrage an eine mit dem Attribut [CustomAuthorization] versehene Aktion gesendet wird. Ich möchte auch eine beschreibende Auth fehlgeschlagene Nachricht zurückgeben können, wenn die Autorisierung fehlschlägt. Nicht nur:

{"Message":"Authorization has been denied for this request."} 

Ich glaube, das übergeordnete HandleUnauthorizedRequest beinhaltet aber wie kann ich dies tun, um mein eigenes Objekt zu schaffen, dass eine JSON-Antwort wird serialisiert?

Zusammenfassend wird mein Autorisierungscode nie vom Framework aufgerufen, auch wenn ich die Aktionen mit meinem [CustomAuthorization] Attribut dekoriere. Es geht einfach nur um den Code innerhalb der Aktion auszuführen.

Zweitens, wie kann ich die nicht autorisierten Antworten implementieren, um ein benutzerdefiniertes JSON-Objekt zu serialisieren?

Vielen Dank für Ihre Hilfe im Voraus, es wird sehr geschätzt!

+0

Ausgehend von meinen Kommentaren, wie ich ein benutzerdefiniertes Berechtigungsattribut implementiert habe ... Für den Anfang, ich denke, Sie OnAuthorization, nicht AuthorizeCore überschreiben möchten. Ich bin mir auch nicht sicher, ob Sie Ihre Klasse versiegeln müssen. –

Antwort

6

Ok ich löste es schließlich, und das ist, wie:

public override void OnAuthorization(HttpActionContext actionContext) { 

    .... 

    if (!authorized) { 

     actionContext.Response =  
        actionContext.Request.CreateResponse(
            HttpStatusCode.Unauthorized, 
            new Dictionary<string, string> { 
               { "hello", "world" } 
            } 
       ); 

    } 

}

die das Ergebnis produziert:

{"hello":"world"} 

Das Dictionary-Objekt ist beliebig, es zeigt nur, dass ein Typ wird erfolgreich in die Antwort serialisiert.

Wenn Sie actionContext.Response nicht festlegen, wird die Anforderung mit der Zielaktion fortgesetzt - dh. es wird von diesem Filter als autorisiert erachtet.

Hoffe, dass hilft anderen in dieser Position.

+0

gut gemacht ...... –

+0

Es war eine Erleichterung, die Lösung so einfach zu finden! Vielen Dank für Ihre Bemühungen, sehr geschätzt. Froh, dass alles jetzt funktioniert! – ComethTheNerd