2011-01-12 7 views
5

C'è qualcosa nei ruoli che non ottengo esattamente. utilizzando l'attributoAttributo di autorizzazione in ordine MVC, priorità e domanda di funzione

[Authorize] Quando si ha l'attributo [Authorize] sul controller e sull'azione:

  1. Quando un ruolo è in entrambi, questo ruolo avranno accesso
  2. Quando un ruolo è solo definito nel controller, ma non nell'azione, nessun accesso
  3. Quando un ruolo è definito solo nell'azione, ma non nel controller, nessun accesso

Ho capito, è logico. È necessario accedere al controller prima di poter eseguire un'azione.

Quello che non ottengo perché questo non funziona:

[Authorize(Roles = "Algemeen Beheer, Admin, Coordinator, Secretariaat")] 
public class FacturatieGegevensController : Controller { 

    [Authorize(Users = "Stefan.coordinator", Roles = "Algemeen Beheer, Admin")] 
    public ActionResult Create(int instID) { 

     return View(); 
    } 

} 

Quando sono entrato come utente Stefan.coordinator che ha il ruolo coordinator, ho posso accesso il controller, ma non posso accedere al Create Azione. Ho pensato che questa sarebbe una relazione OR tra Users e Roles. Non è? e come faccio a farlo funzionare?

risposta

7

La condizione per accedere al metodo Create è:

((ruolo nella {Algemeen Beheer, Amministrazione, Coordinatore, Secretariaat})) [dal controllo di livello] E ((USER in {} Stefan.coordinator) E (RUOLO in {Algemeen Beheer, Admin})) [dal metodo a livello]

Una volta che tutti i AND/OR sono stati elaborati, questo si traduce in semplice:

UTENTE in {} Stefan.coordinator e il ruolo nella {Algemeen Beheer, Admin}

Cioè, all'interno di una particolare AuthorizeAttribute, Utenti e ruoli sono ANDed insieme. E attraverso più AuthorizeAttributes, le condizioni sono ANDed insieme.

Il modo migliore per pensare a questo è che gli attributi [Autorizza] non sono a conoscenza l'uno dell'altro, quindi ciascuno esegue in modo indipendente. Il controller-level va per primo, poi il metodo-level va. Per accedere al metodo, è necessario passare tutte le porte.

Modifica - c'era una domanda su come funziona la logica come sopra.

Let:

A = ROLE is "Algemeen Beheer" 
B = ROLE is "Admin" 
C = ROLE is "Coordinator" 
D = ROLE is "Secretariaat" 
E = USER is "Stefan.coordinator" 

Poiché il controllore di livello [Autorizza] attributo è (A || B || C || D), il livello del metodo [Autorizza] attributo è (E & & (A || B)) e più attributi [Autorizza] sono rappresentati da un AND logico, la logica finisce come (A || B || C || D) & & (E & & (A || B)) , che si riduce a E & & (A || B), che richiede all'utente di essere denominato "Stefan.coordinator" e essere nei ruoli "Algemeen Beheer" o "Admin". Poiché l'utente Stefan.coordinator non si trova in nessuno dei due ruoli, il controllo fallisce.

Per il vostro problema particolare ..

Se si desidera applicare la propria logica al [Autorizza] attributo controlli, sottoclasse AuthorizeAttribute e l'override del metodo AuthorizeCore. In questo modo puoi dire se (Utente == "Stefan.coordinator" || base.AuthorizeCore (...)) {...}.

+0

Forse non sto seguendo la tua logica, perché il '((USER in {Stefan.coordinator})' viene eliminato? –

+0

@Nathan - Ho inviato un chiarimento. Per favore fatemi sapere se questo risponde alla vostra domanda! – Levi

+0

lì è un errore nella tua equazione. Sembra ((USER in {Stefan.coordinator}) ** AND ** (RUOLO in {Algemeen Beheer, Admin})) [dal metodo-livello] perché nessun altro utente può accedere al Azione quando ha questo tag utente – Stefanvds

-3

Il [Authorize] fissata al livello dei controllori è difetto, utilizzata quando non c'è [Authorize] specificato per un metodo di azione individuale.

I due non funzionano insieme e solo uno verrà mai eseguito.

Se si specifica sia un utente che ruoli nel filtro [Authorize], entrambi devono essere soddisfatti per consentire l'accesso al metodo.

Pertanto è un AND non OR.

+5

[Modifica commento precedente] Non è corretto. Tutti gli attributi [Autorizza] (sia controller che metodo) vengono eseguiti. – Levi

Problemi correlati