9

Ho override per controller che verifica se esistono determinati dati di sessione. Questi dati sono necessari affinché il repository funzioni correttamente, quindi se non esiste, dopo il controllo l'utente dovrebbe disconnettersi.Reindirizzamento da Controller Inizializzazione non funzionante

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
{ 
    base.Initialize(requestContext); 
    if (Session["CompanyID"] != null) 
    { 
     repo.CompanyID = (long)Session["CompanyID"]; 
    } 
    else 
    { 
     RedirectToAction("LogOff", "Account"); 
    } 
} 

Il mio codice simile a questo, ma anche quando il RedirectToAction viene richiamato il controller si apre ancora l'azione di default e l'utente non viene disconnesso. Potete consigliarmi su come gestire questo problema?

Sto utilizzando questi dati di sessione in modo tale perché questo è il primo posto in cui riesco ad arrivare a ciò che conosco e qui posso verificare se questo particolare dato esiste. È scritto quando l'utente effettua il login.

Questi dati fanno parte del database Utente. Ho creato un provider di appartenenze e ruoli personalizzato. C'è un modo per aggiungere questi dati a "Utente" del tipo MembershipUser in qualche modo in modo che sia possibile accedervi come utente nome utente costruttore?

risposta

12

Prendere in considerazione l'utilizzo di una personalizzata ActionFilter.

public class HasCompanyIdAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.Session["CompanyID"] == null) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {action = "LogOff", controller = "Account"})); 
     } 
    } 
} 

Si può quindi essere applicato come così:

[HasCompanyId] 
public class MyController : Controller 
{ 
    public ActionResult SomeAction() 
    { 
     return View(); 
    } 
} 

Questo si applica l'attributo per tutte le richieste che MyController (o è sottoclassi) gestisce.

+0

Capisco il principio, ma sembra un po 'poco pratico. Non posso renderlo un filtro globale poiché ci sono aree di applicazione pubbliche, e quindi devo applicarlo a ogni azione che si trova all'interno dell'area che lo richiede? C'è un altro modo per interrompere il caricamento di Controller dopo l'inizializzazione e inviarlo a un'altra azione di un altro Controller? – Zaak

+0

È possibile applicare l'attributo a un controller e verrà applicato per ogni azione all'interno di quel controller o una classe di base del controller e quindi l'azione verrà applicata anche per tutte le azioni di classi derivate! –

+0

Hmm, in questo modo continua a non rispondere al fatto che devo impostarlo una volta. Sembra che fare cose tramite FilterAttribute in questo modo lo imposti ogni volta che un'azione viene eseguita invece solo quando il Controller viene istanziato? – Zaak

2

Implementa semplicemente la soluzione ignorando OnActionExcuting nella classe base. Quindi puoi fare tutto ciò che puoi fare nel filtro azione. Così:

public void OnActionExecuting(ActionExecutingContext filterContext){ 
    if (filterContext.HttpContext.Session["CompanyID"] != null) 
    repo.CompanyID = (long)filterContext.HttpContext.Session["CompanyID"]; 
    else 
    filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {action = "LogOff", controller = "Account"})); 
} 

Alcuni codici omessi per brevità.

Ho provato entrambi gli approcci e ho trovato che implementarlo tramite un filtro azione era più complesso a causa dei requisiti di Iniezione di dipendenza che avevo. Puoi farlo in entrambi i modi, ma ho sentito che l'approccio di classe base era un po 'più chiaro. Volevo anche impostare alcune proprietà sulla classe base per rendere disponibili alcuni oggetti standard ai metodi del controller per salvare i codici ripetitivi che DEV aggiungevano alle azioni. L'approccio di classe base ha reso tutto più semplice.

Un avvertimento io aggiungo è Non sto suggerendo che questo è un buon approccio per l'autenticazione/sicurezza, sto guardando questo puramente dal punto di vista di voler eseguire alcune operazioni/validazione prima di un'azione di esecuzione e anche impostando alcuni dati pre-compilati sull'istanza del controller per seguire il principio DRY.

Spero che aiuti.

Problemi correlati