asp.net MVC, как перенаправить зарегистрированных пользователей, у которых нет профиля, на страницу?
-
21-08-2019 - |
Вопрос
Мы создаем сайт, используя asp.net mvc.Мы хотим, чтобы пользователь мог легко зарегистрироваться и создать учетную запись.Однако в его профиле будет зарегистрирована особая информация, которую мы хотим показать ему *после завершения регистрации и первого входа в систему.
Логика такова: какой бы URL-адрес ни был использован, если пользователь аутентифицирован и не имеет действующего профиля, перенаправьте его на страницу «Создать профиль».
Весь пользовательский интерфейс будет зависеть от выбора профиля.Какой подход нам следует использовать в рамках MVC, чтобы заставить посетителя выполнить этот рабочий процесс?Идеи, которые я могу придумать, требуют тонны дублирования кода в контроллерах и т. д., так что это явно плохая идея.
Мы используем членство для пользователей, но профиль — это наша собственная реализация (без поставщика профилей), которая будет связывать данные профиля с идентификатором пользователя.
Решение
Я думаю, что самый простой способ сделать это — либо создать собственный AuthorizeAttribute, расширив существующий, либо создать отдельный FilterAttribute.Любой из них будет применен ко всем вашим контроллерам и обеспечит наличие профиля у аутентифицированного пользователя.В случае отсутствия профиля фильтр перенаправит пользователя на страницу, где создан профиль.Это можно сделать, установив для свойства result в контексте значение RedirectResult для действия создания профиля.Только если профиль существует и является полным, фильтр позволит пользователю перейти к желаемому действию.
Альтернативно вы можете создать базовый контроллер, который переопределяет OnActionExecuting и выполняет ту же задачу.Я предпочитаю механизм атрибутов, поскольку он более гибкий, т. е. у вас могут быть некоторые общедоступные действия, доступные без профиля (включая действие по настройке профиля).
Другие советы
Отвечая на мой собственный вопрос:В конце концов я создал собственный actionFilter.Вначале я пошел по пути создания подкласса [authorize] в [AuthorizeCheckProfile].Но потом я понял, что вариант использования неправильный:Я не хотел, чтобы только те части моего сайта, которые вошли в систему, перенаправлялись на страницу создания профиля, если профиля пользователя не существовало.я хотел любая страница моего сайта для перенаправления на эту страницу, если это вошедший в систему пользователь без профиля.Единственное место, которое я не хочу проверять, — это создание профиля.Вот код:
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;
}
}
}
}
Побочным эффектом этого метода является сохранение профиля в ключе сеанса.Таким образом, его можно легко получить, чтобы дальнейшие проверки ролей могли выполняться в каждом запросе с другими настраиваемыми фильтрами.Реализация использует Unity и репозитории для доступа к базе данных.
Огромное спасибо сообществу.
Попробуйте рассмотреть ActionFilter и FilterAttribute, если это не требуется большинству страниц, иначе вы можете фактически поместить эту логику перенаправления в global.asax (в этих событиях Begin Request или подобных событиях).