asp.net MVC, как перенаправить зарегистрированных пользователей, у которых нет профиля, на страницу?

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

  •  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 или подобных событиях).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top