2010-01-15 10 views
34

Ho un controller decorato con AuthorizeAttribute. Il controller contiene diverse azioni che richiedono tutte l'autenticazione tranne un'azione che richiede un'autenticazione personalizzata fornita da CustomAuthorizeAttribute.Ignora controller AutorizzaAttributo per una sola azione

La mia domanda è una volta che ho aggiunto [Autorizza] a livello di controller è possibile sovrascriverlo (o rimuoverlo) con [CustomAuthorize] in una sola azione? O devo rimuovere [Autorizza] dal livello del controller e aggiungerlo singolarmente ad ogni altra azione?

Sto chiedendo solo per convenienza perché sono pigro e non voglio decorare ogni azione con l'AutorizzazioneAttributo.

[Authorize] 
public class MyController : Controller { 

    //requires authentication 
    public ViewResult Admin() { 
    return View(); 
    } 

    //... a lot more actions requiring authentication 

    //requires custom authentication 
    [CustomAuthorize] //never invoked as already failed at controller level 
    public ViewResult Home() { 
    return View(); 
    } 

} 

risposta

17

È possibile modificare l'ordine in cui gli attributi eseguiti (utilizzando la proprietà Order), ma credo che in questo caso saranno comunque entrambi girano a meno che uno genera un risultato con effetto immediato. La chiave è avere l'attributo meno restrittivo applicato al più alto livello (classe) e ottenere più restrittivo per i metodi. Se si desidera che l'azione Home sia pubblicamente disponibile, ad esempio, sarà necessario rimuovere l'attributo Authorize dalla classe e applicarlo a ciascuno degli altri metodi.

Se l'azione ha lo stesso livello di permissività, ma ha un risultato diverso, la modifica dell'ordine può essere sufficiente. Ad esempio, normalmente si reindirizza all'azione Logon, ma per Home si desidera reindirizzare all'azione About. In questo caso, assegnare l'attributo di classe Order=2 e l'attributo di azione HomeOrder=1.

+0

In questo caso il CustomAuthorizeAttribute fornisce lo stesso livello di accesso, ma è utilizzato per compensare un bug con Flash e quindi impostando l'Ordine le proprietà sono sufficienti per ottenere il risultato desiderato. Grazie. –

+0

Effettuando l'ordine dell'attributo sull'azione, è stato possibile sovrascrivere l'attributo sul controller. Upvote! –

12

Dopo un po 'di tempo, ho trovato una soluzione. È necessario decorare il controller con un AuthorizeAttribute personalizzato.

public class OverridableAuthorize : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var action = filterContext.ActionDescriptor; 
     if(action.IsDefined(typeof(IgnoreAuthorization), true)) return; 

     var controller = action.ControllerDescriptor; 
     if(controller.IsDefined(typeof(IgnoreAuthorization), true)) return; 

     base.OnAuthorization(filterContext); 
    } 
} 

Quale può essere accoppiato con IgnoreAuthorization su un'azione

public class IgnoreAuthorization : Attribute 
{ 
} 
+3

'IgnoreAuthorization'? Intendi "AllowAnonymous'? – AgentFire

+0

'AllowAnonymous' è ciò di cui avevo bisogno. Grazie, @agentfire –

+0

Sì, stavo per dire, quella logica esatta è già incorporata nel metodo OnAuthorization di AuthorizeAttribute ... tranne che l'attributo che sta cercando è AllowAnonymous. Tuttavia, questa è una grande illustrazione di come è possibile ignorare la rigida logica "AND" che normalmente si applica. Con questo, è possibile applicare un attributo di tipo FancyAuthorizeAttribute al controller con un set di parametri, quindi applicarlo anche a un singolo metodo di controller con parametri diversi e OnAuthorization rileverà l'attributo a livello di azione e salterà il livello di controller uno. – Triynko

66

In MVC 5 è possibile ignorare l'autorizzazione per qualsiasi azione utilizzando il nuovo attributo OverrideAuthorization. Fondamentalmente, lo aggiungi a un'azione con una configurazione di autorizzazione diversa da quella definita nel controller.

lo si fa in questo modo:

[OverrideAuthorization] 
[Authorize(Roles = "Employee")] 
public ActionResult List() { ... } 

Maggiori informazioni su http://www.c-sharpcorner.com/UploadFile/ff2f08/filter-overrides-in-Asp-Net-mvc-5/

+3

Perfetto, proprio quello che serviva! – user1477388

+0

Si noti che questo sopprime anche i filtri di autenticazione globale. Tutti i filtri globali che implementano IAuthorizationFilter saranno disabilitati. – ajbeaven

+0

qualche alternativa nel core asp.net? – shashwat

Problemi correlati