Перенаправляйте пользователей с приостановленными учетными записями без создания петли Redirect

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

Вопрос

У меня есть приложение MVC на основе подписки MVC с базовой службой членства .Net на месте (под некоторыми пользовательскими компонентами для управления учетной записью / подпиской и т. Д.). Пользователи, чьи учетные записи охватывали, или которые вручную приостановили свои учетные записи, должны иметь возможность добраться до единого представления в системе, которая управляет статусом их учетной записи. Управляющий контроллер, который просматривается, защищается с использованием атрибута [авторизации].

Я хочу, чтобы другие взгляды в системе не могут быть доступен, пока пользователь не активировал их учетную запись. В моем базовом контроллере (из которого вытекают все мои защищенные контроллеры), я пытался изменить метод OpactionExecution, чтобы перехватить действие, проверьте на наличие подвесной учетной записи, и если он приостановлен, перенаправляют на единый представитель, который управляет состоянием учетной записи. Но это ставит меня в бесконечную петлю. Когда появляется новое действие, Opactionexecuting снова вызывается, и цикл продолжает идти.

Я не очень хочу расширить атрибут [авторизации], но может, если это нужно.

Любые другие мысли о том, как это сделать на уровне контроллера?

Редактировать: В базовом контроллере мне управалось перенаправить (что впоследствии создали петлю перенаправления) путем изменения свойства FilterContext.Result, установив его в результат результата редректорактакции в результате вашего взгляда. Я заметил каждый раз, когда цикл возникает, FilterContext.result == NULL. Возможно, я должен проверять другую часть FilterContext?

Это было полезно?

Решение

ОК, так вот мое решение на случай, если это поможет кому-либо еще. Там должен быть более элегантный способ сделать это, и я все уши, если у кого-то есть лучшая идея.

В моем basecontroller.cs:

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        ViewData["CurrentUser"] = CurrentUser; // this is a public property in the BaseController

        if (CurrentUser != null && CurrentUser.Account.Status != AccountStatus.Active)
        {
            // if the account is disabled and they are authenticated, we need to allow them
            // to get to the account settings screen where they can re-activate, as well as the logoff
            // action.  Everything else should be disabled.
            string[] actionWhiteList = new string[] { 
                Url.Action("Edit", "AccountSettings", new { id = CurrentUser.Account.Id, section = "billing" }), 
                Url.Action("Logoff", "Account")
            };

            var allowAccess = false;
            foreach (string url in actionWhiteList)
            {
                // compare each of the whitelisted paths to the raw url from the Request context.
                if (url == filterContext.HttpContext.Request.RawUrl)
                {
                    allowAccess = true;
                    break;
                }
            }

            if (!allowAccess)
            {
                filterContext.Result = RedirectToAction("Edit", "AccountSettings", new { id = CurrentUser.Account.Id, section = "billing" });
            }
        }

        base.OnActionExecuting(filterContext);
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top