2015-10-03 4 views
7

Ho provato a google alcune cose sugli attributi personalizzati ma non sono ancora sicuro su come procedere ....Come creare un attributo personalizzato che reindirizzerà a Login se restituisce false, simile all'attributo Authorize - ASP.NET MVC

sto memorizzazione di alcuni importanti dettagli dell'utente nel cd cookies di sessione (ex UserID) una volta nella del registro dell'utente .. e tutto quello che voglio fare è creare un attributo in cui se la

if (Session["UserID"] == null)

quindi reindirizzerà per accedere proprio come fa l'attributo [Autorizza]. In questo modo posso applicare questo attributo a livello di Controller ovunque.

Devo sovrascrivere l'attributo Autorizza? Ne creane uno nuovo? Come faccio a reindirizzare per accedere anche?

Sto anche utilizzando ASP.NET MVC 4

Grazie per qualsiasi aiuto

+0

Si può certamente definire filtri di autenticazione personalizzati (ossia i tipi che implementano [ 'IAuthorizationFilter'] (https://msdn.microsoft.com/ it-us/library/system.web.mvc.iauthorizationfilter% 28v = vs.100% 29.aspx)) ma altrimenti la tua domanda è molto ampia: devi definire molto meglio ciò che vuoi ottenere. – Richard

+0

Scusa se non sto cercando di convincere qualcuno a codificarlo per me, suppongo che stia solo cercando indicazioni su cosa dovrei fare specificamente per la ricerca. – user1189352

+0

@Richard Penso che sia esattamente quello di cui avevo bisogno. Quindi se implemento IAuthorizationFilter, se fallisce, verrà reindirizzato a Login proprio come [Autorizza]? Immagino sia quello che sto più cercando. – user1189352

risposta

13

È possibile creare un costume AuthorizeAttribute e sovrascrivere AuthorizeCore() e HandleUnauthorizedRequest() come richiesto. Aggiungi la tua logica che eseguirà il controllo e il reindirizzamento se necessario.

che sto solo mostrando un semplice esempio usando del MVC ActionFilterAttribute (che non è il posto migliore per fare l'autenticazione/autorizzazione)

public class VerifyUserAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var user = filterContext.HttpContext.Session["UserID"]; 
     if (user == null) 
      filterContext.Result = new RedirectResult(string.Format("/User/Login?targetUrl={0}",filterContext.HttpContext.Request.Url.AbsolutePath)); 
    } 
} 

Non dimenticare di impostare la variabile Session["UserID"] nel metodo di azione /User/Login dopo un'adeguata convalida dell'utente.

+0

Ehi Grazie per questo. Quindi praticamente tutto ciò di cui ho bisogno è di prendere in considerazione l'ActionFilterAttribute, cercare come farlo per AuthorizeAttribute e dovrei essere bravo? se è corretto, ho una buona idea di cosa devo fare. Grazie! – user1189352

+0

@ user1189352 Se non si utilizzano le intestazioni di autorizzazione e nessun altro tipo di convalida standard, anche questo funzionerà correttamente (basta eseguire e controllare una volta, non l'ho fatto).Ma suggerirei di seguire le pratiche standard di utilizzo di AuthorizeAttribute, se possibile. –

+0

Uso le intestazioni di autorizzazione. Ho messo [Autorizza] per tutti i miei controller (se è questo che intendi). Dato che è così, sarebbe meglio per me esaminare l'overload dell'attributo Authorize? – user1189352

8

È possibile creare la propria versione dell'attributo Authorize implementando l'interfaccia IAuthorizationFilter. Ecco un esempio:

class MyCustomFilter : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Session["UserID"] == null) 
     { 
      filterContext.Result = new RedirectResult("/"); 
     } 
    } 
} 

e un esempio di utilizzo:

[MyCustomFilter] 
public ActionResult About() 
{ 
    ViewBag.Message = "Your application description page."; 

    return View(); 
} 
+0

wow che semplice? okay cercherò in questo ty – user1189352

+1

Sì, che semplice :) puoi imparare molto di più da qui: http://www.asp.net/mvc – Nasreddine

+0

Tieni presente che l'iniezione delle dipendenze non sarà possibile tramite il costruttore facendo così . Se hai bisogno di DI, vedi questa risposta: http://stackoverflow.com/questions/16708942/should-i-be-using-an-iauthorizationfilter-if-i-wish-to-create-an-apikey-restrict –

Problemi correlati