asp.net MVC, como redirecionar usuários registrados que não têm um perfil de página?
-
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.
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)