Перенаправляйте пользователей с приостановленными учетными записями без создания петли Redirect
-
30-09-2019 - |
Вопрос
У меня есть приложение 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);
}