2012-03-06 23 views
38

Possiedo un attributo di autorizzazione su un controller, ma mi piacerebbe disattivarlo in un'unica azione. Ho creato il mio filtro di autorizzazione e aggiunto "Anonimo" all'elenco dei ruoli. Nel mio filtro, quindi, restituisco true se Anonymous appare nell'elenco dei ruoli.È possibile disabilitare l'autorizzazione per un'azione in un controller MVC?

Tuttavia, sembra che non superi la pagina di accesso come se l'autorizzazione del controller anticipasse qualcos'altro.

+0

'(1):' Non sono sicuro che ti capisco, un po 'di codice sarebbe buono. '(2):' È possibile aggiungere attributi di autorizzazione sui metodi di azione. – gideon

+0

È possibile creare la propria versione dell'attributo. http://stackoverflow.com/questions/746998/override-authorize-attribute-in-asp-net-mvc – Tx3

+0

Accidenti, tutti sembrano non capirti :). Capisco, ma volevo una soluzione perché ho lo stesso problema. Hai trovato qualcosa nel frattempo? –

risposta

69

È possibile aggiungere [Authorize] alla classe controller e quindi aggiungere [AllowAnonymous] alla singola azione che non si desidera autorizzare. Esempio:

[Authorize] 
public class AccountController : Controller 
{ 
    public ActionResult Profile() 
    { 
     return View(); 
    } 

    [AllowAnonymous] 
    public ActionResult Login() 
    { 
     return View(); 
    } 
} 
+1

Funziona solo su MVC4 e versioni successive, ma funziona perfettamente – Nathan

-3

Non aggiungere AuthorizationAttribute al tuo metodo di azione, dove non è richiesto per esempio.

mio attributo personalizzato

public class AuthorizationFilterAttribute : AuthorizeAttribute 
{ 
     Some code... 
} 

mio regolatore

public class UserController : BaseController, IDisposable 
{ 
     [AuthorizationFilterAttribute] 
     public ActionResult UserList() 
     { 
      //Authorize attribute will call when this action is executed 
     } 

     public ActionResult AddUser() 
     { 
      //Authorize attribute will not call when this action is executed 
     } 

} 

Io spero tu abbia il mio punto quello che sto cercando di dire voi.

================= Answer Aggiornato ========================== ===================== Crea un altro attributo come di seguito.

public sealed class AnonymousAttribute : Attribute { } 

Inserire il codice sotto il metodo OnAuthorization.

public override void OnAuthorization(AuthorizationContext filterContext) { 
      bool checkForAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AnonymousAttribute), true) 
      || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AnonymousAttribute), true); 
      if (!skipAuthorization) { 
       base.OnAuthorization(filterContext); 
      } 
     } 
+0

Ok ma questo significa aggiungere filtri su tutte le azioni del controller. Mi piace l'idea di mantenere il filtro di autorizzazione in alto e quindi disabilitare dove necessario. Sembra più robusto/sicuro in questo modo. – jaffa

+0

Sì, giusto. Fammi sapere che è un lavoro per te o no? Se lo è, segnalo come risposta, in modo che sia utile per gli altri. –

+0

Funziona per ottenere l'autorizzazione sulle sole azioni che vuoi, ma non era una domanda dell'OP. – Kyle

3

È possibile creare la propria versione dell'attributo.

C'è una domanda molto simile e c'è una buona risposta su come implementare il proprio attributo che gestisce questa situazione.

Override Authorize Attribute in ASP.NET MVC

Btw. potresti anche creare il controller che avrebbe l'autorizzazione per impostazione predefinita.

Base

[Authorize] 
public abstract class SecureControllerBase : Controller 
{ 
} 

Uso

public class MyController : SecureControllerBase 
{ 
} 
+0

Grazie, ma diciamo che ho un controller con 10 metodi di azione che richiedono l'autorizzazione e solo 1 azione senza. Il mio controller ha l'autorizzazione abilitata su tutte le azioni (avendo il filtro di autorizzazione nella parte superiore della definizione del controller), tuttavia voglio solo spegnerlo su un metodo di azione. – jaffa

+0

Se si aggiunge [OptionalAuthorize] al controller e quindi [OptionalAuthorize (false)] sopra l'azione? Funziona per te? – Tx3

0

Basta aggiungere l'attributo alle azioni che si desidera filtrare, e non sulla classe controller. Non progettando azioni, esse non verranno filtrate, a condizione che il controller o uno dei suoi controllori di base non abbia ottenuto l'attributo.

+2

Voglio l'eccezione alla regola, quindi attiva il controller e disattiva per una singola azione. – jaffa

1

Ho appena eseguito una soluzione utilizzando Azure ACS come provider di identità federato e la risposta accettata non ha funzionato per me. Per coloro che stanno lottando, la mia soluzione era quella di bypassare del tutto la sicurezza per il controller/le viste richieste.

Creare un nuovo controller/viste per quelle azioni che è necessario ignorare l'autorizzazione.

E nel web.config aggiungere quanto segue,

<location path="TheNameOfTheControllerYouWantToBypass"> 
    <system.web> 
    <authorization> 
    <allow users="*" /> 
    </authorization> 
    </system.web> 
</location> 
Problemi correlati