asp.net MVC, como redirecionar usuários registrados que não têm um perfil de página?

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

  •  21-08-2019
  •  | 
  •  

Pergunta

Estamos construindo um site usando asp.net MVC. Queremos permitir que o usuário se registre facilmente e criar uma conta. Há no entanto uma peça muito especial de informação, que será registrado em seu perfil, que queremos mostrar para ele * após o registro for concluído, e ele está entrando pela primeira vez.

A lógica é o que o URL que foi atingido, se o usuário é autenticado e não tem um perfil válido, redirecioná-lo para a página "Criar perfil".

Toda a ui dependerá essas escolhas perfil. Que abordagem que devemos usar no quadro MVC, para forçar este fluxo de trabalho sobre o visitante? As idéias que podem surgir com exigem toneladas de duplicação de código em controladores etc, pelo que a sua claramente uma má idéia.

Estamos usando Membership para os usuários, mas o perfil é a nossa própria implementação (sem provedor de perfil) que vai ligar dados de perfil para um userId.

Foi útil?

Solução

Eu acho que a maneira mais fácil de fazer isso é criar uma personalizado AuthorizeAttribute, ampliando a já existente ou criar um FilterAttribute separado. Qualquer um destes teria se aplicado a todos os controladores e garantir que um usuário autenticado tem um perfil. No caso em que não existe nenhum perfil, o filtro seria redirecionar o usuário para a página onde o perfil é criado. Isso seria feito, definindo a propriedade resultado no contexto de um RedirectResult à ação criação do perfil. Só se o perfil existe e é completa se o filtro permite que o usuário prossiga para a ação desejada.

Como alternativa, você pode criar um controlador de base que substitui OnActionExecuting e executa a mesma tarefa. Eu prefiro o mecanismo de atributo como é mais flexível, ou seja, você pode ter algumas ações públicas que estão disponíveis sem o perfil (incluindo a ação definição do perfil).

Outras dicas

Respondendo a minha própria pergunta: No final, eu criei um ActionFilter personalizado. No início, tomei o caminho da subclasse [autorizar] em [AuthorizeCheckProfile]. Mas então eu percebi que o caso de uso estava errado: eu não queria que o registado em apenas partes do meu site para redirecionar para a página crie-profile, se nenhum perfil de usuário existiu. Eu queria qualquer página do meu site para redirecionar para essa página, se for um usuário conectado sem perfil. O único lugar que eu não quero para verificar se está no real perfil-criar. Aqui está o 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;
            }
        }
    }
}

Ele tem o efeito colateral que ele irá armazenar o perfil de uma chave de sessão. Desta forma, ele pode ser facilmente ser obtida de modo que o papel mais verificações pode acontecer em cada pedido com outros filtros personalizados. A implementação usa Unidade e repositórios de acesso db.

Um grande obrigado para com a comunidade.

Tente considerar Acção de filtro e filtro de atributo, se não a maioria das páginas precisa fazê-lo, ou então, você pode realmente colocar essa lógica redirecionamento para global.asax (naqueles Comece Request ou eventos similares)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top