Ultimamente, parlando con alcuni colleghi e sui newsgroup, mi è capitato di incorrere in qualche incomprensione sul funzionamento della sezione authorization.

Visto che è capitato così tante volte nell'arco di una sola settimana, direi che a sto punto lo scrivo qui, così almeno se me lo richiedono... rimando al link sul mio blog :)

Allora come è scritto qui:

http://msdn2.microsoft.com/En-US/library/acsd09b0(VS.80).aspx

At run time, the authorization module iterates through the allow and deny elements, starting at the most local configuration file, until the authorization module finds the first access rule that fits a particular user account. Then, the authorization module grants or denies access to a URL resource depending on whether the first access rule found is an allow or a deny rule.

Questo vuol dire che cambiando l'ordine il risultato... cambia! (sapevo io che la matematica mi avrebbe portato fuori strada  :P)

Quando il framework incontra un elemento di autorizzazione che gli va bene, lui entra e tanti saluti a tutto il resto, anche se in fondo abbiamo uno splendido "deny *". Questo probabilmente per evitare configurazioni lacoontiche di accessi che creerebbero solo confusione e basta.

Quindi, se io voglio restringere l'accesso a solo particolari gruppi/utenti, devo fare attenzione a registringere gli accessi a tutti tranne quei gruppi/utenti, e devo anche fare attenzione a mettere il deny "*" come ultima riga di configurazione se non voglio che vengano buttati fuori tutti.

Quindi una riga così

<deny users="?" />
<allowroles="PippoGroup" />

Non va bene, perchè chiunque si autentica, sia membro di PippoGroup o meno, ottiene accesso alla risorsa perchè il framework non trova scritto diversamente!

La sintassi corretta è:

<allow roles="PippoGroup" />
<deny users="*" />

Che il framework traduce in "o sei di PippoGroup, oppure fuori :)

Attenzione, per quanto ho detto, a non mettere deny users PRIMA di allow... in questo caso, taglia fuori chiunque, anche se appartiene a PippoGroup.
Da notare che a questo punto deny users="?" non serve piu in quanto ha valore l'asterisco, nel caso uno non sia del gruppo PippoGroup!

P.S.: Un grazie particolare a Roberto che mi ha fatto notare quanto LiveWriter mi avesse scombinato il post :)
P.P.S.: Un altro grazie particolare a Mrkino che mi ha fatto notare che, probabilmente ubriaco, ho scambiato "Roles" con "groups". :)