asp.net MVC, come reindirizzare gli utenti registrati che non hanno un profilo alla pagina?

StackOverflow https://stackoverflow.com/questions/1079703

  •  21-08-2019
  •  | 
  •  

Domanda

Stiamo costruendo un sito utilizzando asp.net MVC. Vogliamo permettere all'utente di registrarsi e creare un account con facilità. C'è anche un pezzo molto particolare di informazioni, che verrà registrato nel suo profilo, che vogliamo mostrare a lui * dopo la registrazione è terminata, e si sta registrando per la prima volta.

La logica è tutto ciò che l'URL che è stato colpito, se l'utente è autenticato e non dispone di un profilo valido, lo reindirizzare al "Crea profilo" pagina.

L'intera interfaccia utente dipende da quelle scelte profilo. Quale approccio dovremmo utilizzare all'interno del framework MVC, per forzare questo flusso di lavoro sul visitatore? Le idee che posso venire con richiedono tonnellate di duplicazione di codice in controllori, ecc, quindi la sua chiaramente una cattiva idea.

Stiamo usando appartenenza per gli utenti, ma il profilo è la nostra propria implementazione (nessun fornitore di profilo) che collegherà i dati del profilo a un ID utente.

È stato utile?

Soluzione

Credo che il modo più semplice per farlo è creare un personalizzato AuthorizeAttribute, estendendo l'esistente o creare un FilterAttribute separata. Uno di questi sarebbe ottenere applicato a tutti i controller e garantire che un utente autenticato dispone di un profilo. Nel caso in cui non esiste un profilo, il filtro potrebbe reindirizzare l'utente alla pagina in cui viene creato il profilo. Ciò avverrebbe impostando la proprietà risultato sul contesto ad un RedirectResult all'azione creazione del profilo. Solo se il profilo esiste ed è completo sarebbe il filtro consentire all'utente di procedere all'azione desiderata.

In alternativa, si potrebbe creare un controller di base che sostituisce OnActionExecuting e svolge lo stesso compito. Io preferisco il meccanismo attributo come è più flessibile, vale a dire, si potrebbe avere alcune azioni pubbliche che sono disponibili senza il profilo (tra cui l'azione impostazione del profilo).

Altri suggerimenti

Rispondendo alla mia domanda: Alla fine ho creato un ActionFilter personalizzato. In principio, ho preso la strada della creazione di sottoclassi [autorizzo] in [AuthorizeCheckProfile]. Ma poi ho capito che il caso d'uso era sbagliato: non volevo le uniche parti registrati in del mio sito per reindirizzare alla pagina di creare profilo, se nessun profilo utente esisteva. Volevo qualsiasi pagina del mio sito per reindirizzare a quella pagina, se un utente connesso con nessun profilo. L'unico posto che non voglio per controllare che è nel reale profilo-creare. Ecco il codice:

public class AssertProfileAttribute : ActionFilterAttribute {
    public AssertProfileAttribute() {
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (filterContext.HttpContext.Request.IsAuthenticated == false)
            return;
        //we have a user, but does he have a profile?
        if (filterContext.HttpContext.Session["UserProfile"] == null) { //not in the session
            IUnityContainer container = filterContext.HttpContext.Application["container"] as IUnityContainer;
            Profile hasProfile = container.Resolve<IProfileRepository>().GetUserProfile(Membership.GetUser());
            if (hasProfile == null) {
                //we have to redirect to the create profile 
                string returnURL = filterContext.HttpContext.Request.AppRelativeCurrentExecutionFilePath;
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Profile", action = "Create", returnTo = returnURL }));
            } else {
                //he has a profile but we haven't put it in session yet
                filterContext.HttpContext.Session["UserProfile"] = hasProfile;
            }
        }
    }
}

E 'l'effetto collaterale che memorizzerà il profilo in una chiave di sessione. In questo modo può essere facilmente essere recuperati in modo che ulteriori controlli dei ruoli possono accadere in ogni richiesta con altri filtri personalizzati. L'implementazione utilizza Unità e depositi per l'accesso db.

Un grande grazie alla comunità.

Prova a prendere in considerazione Operazione filtro e filtro attributo se non la maggior parte le pagine devono farlo, altrimenti, si può effettivamente mettere questa logica reindirizzamento a global.asax (in quelli INIZIARE RICHIESTA o eventi simili)

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