2014-09-12 4 views
7

Ho una classe personalizzata AuthorizationFilter per gestire l'autorizzazione alla mia API. Ora, ho bisogno di migliorarlo aggiungendo alcuni attributi ai metodi che saranno letti solo in alcune situazioni.Come sapere quale metodo controller verrà chiamato dal filtro Autorizzazione API Web

posso ottenere il controller da actionContext.ControllerContext ma:

Come posso sapere quale Controller metodo verrà chiamato dal metodo della mia classe personalizzata AuthorizeAttributeIsAuthorized? Quindi posso ottenere gli attributi con la riflessione.

Modifica: aggiunta di più info-

Se ricevo una chiamata come localhost/api/myapi/?id=4 voglio ottenere il vero nome del metodo che verrà eseguito nel controller come GetById(int id).

In questo modo ho potuto verificare se il metodo ha attributi personalizzati, ho bisogno di aggiungerlo.

+0

Mg ho cancellato la mia risposta come ho letto male la tua domanda . Hai visto la risposta di @Henrik Cooke? che funziona per me – wal

risposta

18

In API Web 2 è possibile accedere al nome dell'azione con:

actionContext.ActionDescriptor.ActionName 
+6

Si prega di aggiungere ulteriori dettagli per spiegare cosa sta succedendo. – twoleggedhorse

+4

@twoleggedhorse cosa c'è di più da spiegare? – wal

+0

Non è possibile aggiungere in 'actionContext' a web api 2. Per 1 persone è già implementata la classe base' ApiController', quindi non è possibile implementare un'altra classe base sul controller ('AuthorizeAttribute') Quindi il motivo per cui diverse persone hanno aggiunto per maggiori dettagli –

1

Non hai inserito alcun codice, ma non puoi guardare i RouteData in HttpActionContext?

public class MyAuthAttribute : AuthorizeAttribute 
{ 
    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     var routeData = actionContext.ControllerContext.RouteData; 

     //If you don't have an action name, I've assumed "index" is the default. 
     var actionName = routeData.Values.ContainsKey("id") ? routeData.Values["id"].ToString() : "Index"; 

     //you can then get the method via reflection... 
     var attribs = actionContext.ControllerContext.Controller.GetType() 
        .GetMethod(actionName, BindingFlags.Public | BindingFlags.Instance) 
        .GetCustomAttributes(); 

     //Do something... 

     return base.IsAuthorized(actionContext); 
    } 
} 
0

Ebbene si può provare questo da percorso dati

// Gets controller name  
var controller = routeData.GetRequiredString("controller"); 

// Gets action name 
var action = routeData.GetRequiredString("action"); 
Problemi correlati