asp.net MVC, comment rediriger les utilisateurs enregistrés qui n'ont pas de profil vers la page ?

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

  •  21-08-2019
  •  | 
  •  

Question

Nous construisons un site en utilisant asp.net mvc.Nous voulons permettre à l'utilisateur de s'inscrire et de créer facilement un compte.Il y a cependant une information très spéciale, qui sera enregistrée dans son profil, que nous souhaitons lui montrer *une fois l'inscription terminée et qu'il se connecte pour la première fois.

La logique est quelle que soit l'URL consultée, si l'utilisateur est authentifié et n'a pas de profil valide, redirigez-le vers la page "Créer un profil".

L'ensemble de l'interface utilisateur dépendra de ces choix de profil.Quelle approche devrions-nous utiliser dans le cadre MVC pour imposer ce flux de travail au visiteur ?Les idées que je peux proposer nécessitent des tonnes de duplication de code dans les contrôleurs, etc., donc c'est clairement une mauvaise idée.

Nous utilisons l'adhésion pour les utilisateurs, mais le profil est notre propre implémentation (pas de fournisseur de profil) qui connectera les données de profil à un identifiant utilisateur.

Était-ce utile?

La solution

Je pense que la meilleure façon de le faire est soit de créer une AuthorizeAttribute personnalisée, étendant l'une ou créer un existant FilterAttribute séparé. Soit l'un de ces obtiendriez appliquée à tous vos contrôleurs et faire en sorte qu'un utilisateur authentifié a un profil. Dans le cas où aucun profil existe, le filtre serait rediriger l'utilisateur vers la page où le profil est créé. Cela serait fait en définissant la propriété de résultat sur le contexte d'un RedirectResult à l'action de création de profil. Seulement si le profil existe et est complète serait le filtre permet à l'utilisateur de passer à l'action souhaitée.

Vous pouvez créer un contrôleur de base qui remplace OnActionExecuting et exécute la même tâche. Je préfère le mécanisme d'attribut car il est plus souple, à savoir, vous pourriez avoir des actions publiques qui sont disponibles sans profil (y compris l'action de réglage du profil).

Autres conseils

Répondant à ma propre question:En fin de compte, j'ai créé un actionFilter personnalisé.Au début, j'ai choisi de sous-classer [authorize] dans [AuthorizeCheckProfile].Mais ensuite j'ai réalisé que le cas d'utilisation était erroné :Je ne voulais pas que les parties connectées uniquement de mon site soient redirigées vers la page de création de profil, si aucun profil utilisateur n'existait.j'ai voulu n'importe quelle page de mon site pour rediriger vers cette page, s'il s'agit d'un utilisateur connecté sans profil.Le seul endroit où je ne veux pas vérifier cela est dans la création de profil réelle.Voici le code :

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;
            }
        }
    }
}

Cela a pour effet secondaire de stocker le profil dans une clé de session.De cette façon, il peut être facilement récupéré afin que des vérifications de rôle supplémentaires puissent avoir lieu dans chaque demande avec d'autres filtres personnalisés.L'implémentation utilise Unity et des référentiels pour l'accès à la base de données.

Un grand merci à la communauté.

Essayez envisager ActionFilter et FilterAttribute sinon la plupart des pages ont besoin de le faire, ou bien, vous pouvez réellement mettre cette logique de redirection vers Global.asax (dans les événements de demande Begin ou similaires)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top