Domanda

Mi chiedevo se / come posso ignorare il comportamento predefinito [Autorizza] in ASP.NET MVC. So che posso creare un nuovo filtro di azione, fare il mio attributo e così via; Sono solo interessato se posso semplicemente cambiare il comportamento [Autorizza] e sostituire il suo funzionamento con il mio proprio codice?

Modifica : Ragazzi e Ragazze. Apprezzo il vostro ingresso, ma come ho già scritto, io sono non cerca di introdurre un nuovo [XYZAuthorize] attributo. Sono consapevole di come fare questo. Voglio mantenere la notazione [Autorizza] ma basta cambiare come funziona.

È stato utile?

Soluzione

Si, dare un'occhiata alla documentazione MSDN per AuthorizeAttribute: http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx .

In sostanza, è possibile ignorare il metodo OnAuthorization () e personalizzare il comportamento. Ci sono altri metodi virtuali sul l'attributo pure.

EDIT: Come Bruno ha sottolineato, è possibile ignorare il metodo AuthorizeCore (). La differenza principale è che AuthorizeCore () prende un HttpContextBase, mentre OnAuthorization () prende un AuthorizationContext. Un'istanza di AuthorizationContext fornisce ulteriori informazioni, come ad esempio il controller, il RequestContext e la RouteData. Essa consente inoltre di specificare un ActionResult.

AuthorizeCore () è più limitato nelle informazioni è possibile accedere, così come il risultato si può tornare, ma se avete bisogno di autorizzare i dati memorizzati nella cache, quindi la logica deve gestire il caso in cui non si ha nulla di tutto ciò dati aggiuntivi (dal momento che i dati è servita dalla cache prima che la richiesta viene instradato attraverso la pipeline MVC).

Come sempre, è necessario capire lo scenario e gli strumenti disponibili e trade-off tra di loro.

Altri suggerimenti

È possibile creare una sottoclasse il filtro AuthorizeAttribute e aggiungere la propria logica al suo interno.

Vediamo un esempio. Diciamo che si desidera autorizzare sempre le connessioni locali. Tuttavia, se si tratta di una connessione remota, si desidera mantenere la logica di autorizzazione al solito.

Si potrebbe fare qualcosa di simile:

public class LocalPermittedAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return (httpContext.Request.IsLocal || base.AuthorizeCore(httpContext)));
        }
}

In alternativa si può sempre autorizzare un certo indirizzo remoto (la macchina, per esempio).

Questo è tutto!

Modifica: dimenticato di dire, si intende utilizzare lo stesso che si usa il filtro AuthorizeAttribute:

class MyController : Controller
{
    [LocalPermittedAuthorize]
    public ActionResult Fire()
    {
        Missile.Fire(Datetime.Now);
    }
}

Implementare il proprio provider di ruoli e impostare la vostra applicazione per utilizzarlo. Poi l'attributo Autorizza rispetterà il codice athorization.

vedo solo 2 modi:. Sovrascrivendo il metodo AuthorizeAttribute.OnAuthorization o creare il proprio attributo Autorizza da zero

1) molto facile:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        /// your behavior here
    }
}

2) troppo facile - basta guardare alla fonte ASP.NET MVC, AuthorizeAttribute.cs file

Sembra è possibile implementare un filtro personalizzato come al solito (ed ereditare AuthorizeAttribute se volete), e quindi creare un nuovo ActionInvoker che eredita ControllerActionInvoker e sovrascrive getFilters. In getFilters, si chiama base.GetFilters() per ottenere l'elenco dei filtri, la scorrere l'AuthorizationFilters e sostituire le chiamate a AuthorizeFilter con chiamate dirette al proprio filtro personalizzato.

Un altro modo è quello di implementare il potenziale provider di appartenenze personalizzato e di ruolo, a seconda di quello che stai cercando di fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top