asp.net MVC, cómo redirigir a los usuarios registrados que no tienen un perfil a la página?

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

  •  21-08-2019
  •  | 
  •  

Pregunta

Estamos construyendo un sitio utilizando asp.net mvc. Queremos que el usuario pueda registrarse y crear una cuenta fácilmente. No es sin embargo una pieza muy especial de la información, que será registrado en su perfil, que queremos mostrar a él * después de finalizar el registro, y él está de iniciar sesión por primera vez.

La lógica es cualquiera que sea la dirección URL que fue golpeado, si el usuario está autenticado y no tiene un perfil válido que le redirigir a la "Crear perfil".

Toda la interfaz de usuario dependerá de las opciones del perfil. ¿Qué actitud se debe utilizar en el marco de MVC, para forzar a este flujo de trabajo en el visitante? Las ideas que se puede topar con requieren toneladas de duplicación de código en los controladores, etc, por lo que su claramente una mala idea.

Estamos utilizando membresía para los usuarios, pero el perfil es nuestra propia aplicación (sin proveedor de perfil) que conectará los datos de perfil a un ID de usuario.

¿Fue útil?

Solución

Creo que la forma más sencilla de hacerlo es o bien crear una costumbre AuthorizeAttribute, extendiendo la ya existente o crear una FilterAttribute separada. Cualquiera de éstos obtendrían aplicado a todos los controladores y asegurarse de que un usuario autenticado tiene un perfil. En el caso en que no existe ningún perfil, el filtro podría redirigir al usuario a la página donde se crea el perfil. Esto se haría mediante el establecimiento de la propiedad resultado en el contexto de un RedirectResult a la acción de creación de perfiles. Sólo si existe el perfil y se completa sería el filtro de permitir al usuario para proceder a la acción deseada.

Como alternativa, puede crear un controlador de base que anula OnActionExecuting y realiza la misma tarea. Yo prefiero el mecanismo de atributo, ya que es más flexible, es decir, usted podría tener algunas acciones públicas que están disponibles sin el perfil (incluyendo la acción de ajuste de perfil).

Otros consejos

contestar a mi propia pregunta: Al final he creado un actionFilter personalizado. En un principio, tomé el camino de la creación de subclases [autorizo] en [AuthorizeCheckProfile]. Pero entonces me di cuenta de que el caso de uso que estaba mal: que no quería las únicas partes que has iniciado sesión de mi sitio web para redirigir a la página de creación de perfil, cuando no existe otro perfil de usuario. Quería página de mi sitio web para redirigir a la página, si es un usuario registrado con ningún perfil. El único lugar que no quiero para comprobar que se encuentra en el actual perfil a crear. Aquí está el código:

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

Tiene el efecto secundario que va a almacenar el perfil en una clave de sesión. De esta forma puede estar fácilmente se fue a buscar para que más controles papel que pueden ocurrir en cada petición con otros filtros personalizados. La aplicación utiliza la Unidad y repositorios de acceso db.

Muchas gracias a la comunidad.

Trate de considerar Acción de filtrado y filtro de atributos si no la mayoría páginas tienen que hacerlo, o de lo contrario, en realidad se puede poner esta lógica redirección a Global.asax (en los que Begin Solicitud o eventos similares)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top