2012-06-18 9 views
11

Nella mia applicazione asp.net mvc3, ho un attributo di autorizzazione personalizzato come mostrato di seguito.HandleUnauthorizedRequest not overriding

public class CustomAuthorize : AuthorizeAttribute 
{ 
    public IAccountRepository AccountRepository { get; set; } 

    public CustomAuthorize() 
    { 
     this.AccountRepository = new UserModel(); 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     base.AuthorizeCore(httpContext); 
     return AccountRepository.isEnabled(HttpContext.Current.User.Identity.Name); 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

devo il tag [CustomAuthorize] sulle mie azioni di controllo, e il metodo AuthorizeCore funziona bene - esegue la logica voglio che (assicurandosi che l'account è effettivamente abilitato), e poi tornare come tale.

Tuttavia, il metodo sostituito HandleUnauthorizedRequest, che, a quanto ho capito, dovrebbe consentirmi di controllare il comportamento di una richiesta non autorizzata, non è in esecuzione. Inserisco un breakpoint, inserisco il codice, accedo alla mia applicazione non autorizzata e il codice non funziona mai.

Cosa mi manca?

EDIT: Ho fatto qualche altra ricerca e ho trovato alcune altre persone che hanno avuto questo problema, ma purtroppo nessuna soluzione.

EDIT2: Codice di esempio

[CustomAuthorize] 
public class UserController: Controller 
{ 
    public UserController() 
    { 
     //do stuff here 
    } 
} 

EDIT 3: @Fabio

Ecco quello che sto cercando di fare. Ho una pagina di accesso (auth di moduli) che funziona bene - chiama il mio login personalizzato, quindi chiama la mia autorizzazione di AuthorizeCore. La mia applicazione utilizza una grande quantità di chiamate Ajax, e il mio obiettivo finale è per ogni volta che un utente sta usando l'applicazione, e l'amministratore li disabilita, effettuare una chiamata Ajax dopo essere stato disabilitato (anche se è ancora connesso) dovrebbe effettuare il logout. Tuttavia, per fare ciò, voglio restituire una risposta personalizzata se l'utente sta effettuando una chiamata Ajax e, per questo, ho bisogno di sovrascrivere HandleUnauthorizedRequest. Ma il mio Authorize Core (e per estensione HandleUnauthorizedRequest) vengono ignorati se l'utente ha effettuato l'accesso (nonostante io abbia i tag di autorizzazione personalizzati su tutte le azioni del mio controller che l'ajax sta chiamando).

In breve: Voglio autorizzare l'utente a ogni richiesta, non solo la richiesta di accesso (che sembra essere ciò che il provider di appartenenze sta facendo adesso)

+0

Avete qualsiasi altro attributo che ereditano da AuthorizeAttribute? Hai impostato AuthorizeAttribute a livello di classe o su una classe base? –

+0

Ho un provider di appartenenze personalizzato, questa classe è dichiarata nello stesso file. Non ho altri attributi che ereditano da AuthorizeAttribute per quanto ne so. – Mansfield

+0

Un breakpoint inserito nell'interruzione di AuthorizeCore, come previsto? –

risposta

6

Ho finito per cambiare il mio approccio un bel po '. Ho implementato il controllo delle autorizzazioni individuali, e quindi ciò ha causato il richiamo di AuthorizeCore ogni volta (e non la memorizzazione nella cache, che suppongo fosse ciò che stava accadendo prima).

È interessante notare che l'interruzione della commutazione HandleUnauthorizedRequest non si interrompe, ma lo inserirà nel metodo. Strano, e mi ha buttato via per un po ', ma ora l'ho risolto.

codice se qualcuno è interessato:

public class CustomAuthorize : AuthorizeAttribute 
{ 
    public string Permissions { get; set; } 

    private IAccountRepository AccountRepository { get; set; }   

    private string[] permArray { get; set; } 

    private string reqStatus { get; set; } 

    public CustomAuthorize() 
    { 
     this.AccountRepository = new UserModel(); 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     base.AuthorizeCore(httpContext); 

     if (Permissions != null) { 
      permArray = Permissions.Trim().Split(' '); 

      if (AccountRepository.isEnabled(httpContext.User.Identity.Name)) { 
       this.reqStatus = "permission"; 
       return AccountRepository.hasPermissions(permArray);      
      } else { 
       return false; 
      } 
     } else { 
      return AccountRepository.isEnabled(httpContext.User.Identity.Name); 
     } 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (this.reqStatus == "permission") { 
      filterContext.Result = new RedirectResult(MvcApplication.eM.cause("no_permission", "redirect")); 
     } else { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 

E poi ho decorato il controller con questo:

[CustomAuthorize(Permissions="test_perm")]

+0

ESATTAMENTE quello che dovevo vedere !!!! –

2

Questa può essere una stupida risposta/domanda, ma è Il metodo AccountRepository.isEnabled restituisce false in modo che possa essere eseguita HandleUnauthorizedRequest?

Se restituisce true, il metodo HandleUnauthorizedRequest non verrà eseguito.

+0

Penso che potresti esserti imbattuto in qualcosa. Sembra che AuthorizeCore venga sempre chiamato solo se l'utente ha già effettuato l'accesso. Quindi, se esco dall'applicazione e navigo sul mio controller, non eseguirà il mio AuthorizeCore personalizzato, ma reindirizzerà automaticamente alla pagina di accesso. Vedi il mio presto venire a modificare il mio OP. – Mansfield