Если вы не хотите, чтобы определенная страница была доступна через URL, один из доступных вариантов - убедиться, что нет доступа к странице через URL. Чтобы получить доступ к странице, выполните действие POST, которое будет возвращать представление, а не перенаправление. Это будет означать, что представление, которое возвращает ваше действие POST, будет отображаться на странице с URL-адресом предыдущей страницы. Для примера:
Страница URL-адрес /login
, и после входа пользователь перенаправляется на страницу B. Теперь URL-адрес /home
. Страница B отправляет запрос POST, и содержимое страницы становится Страницей C, но URL все еще остается как /home
. Единственный способ просмотреть содержимое страницы C - это посетить страницу B и отправить запрос POST.
Это нарушает паттерн PRG, но это один из вариантов.
Существует еще одна альтернатива: сохранить текущие разрешения пользователя, указав, на какую страницу ему разрешено войти, и проверить, авторизован ли пользователь на просмотр страницы перед выполнением действия. Вы можете поместить код в ActionAttribute
, который вы можете применить к своим методам действий или целым контроллерам. Если вы хотите более подробное объяснение этого метода, оставьте мне комментарий, и я напишу другой ответ, описывающий этот метод более подробно.
<ч />
Вот краткое подтверждение концепции, описанной выше:
public class PermissionsNeeded : ActionFilterAttribute
{
string expectedPermission;
public PermissionsNeeded(string permission)
{
expectedPermission = permission;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var currentPermissions = filterContext.HttpContext.Session["CurrentPermissions"] as IEnumerable<string> ?? new List<string>();
// If user does NOT have permission to access the action method
if(!currentPermissions.Contains(expectedPermission)
{
throw new HttpException(403, "User is not authorized to view this page");
}
}
}
class YourController : Controller
{
[HttpPost]
public ActionResult PageB()
{
var currentPermissions = Session["CurrentPermissions"] ?? new List<string>();
currentPermissions.Add("PostedFromPageB");
Session["CurrentPermissions"] = currentPermissions;
return RedirectToAction("PageC");
}
[PermissionsNeeded("PostedFromPageB")
public ActionResult PageC()
{
return View();
}
}
В настоящее время пользовательский атрибут может принимать только одно разрешение за раз, что является простым ограничением для исправления. Вы будете нести ответственность за удаление разрешений, сохраненных в сеансе, если считаете, что у пользователя больше не должно быть определенных разрешений. Я выдал исключение HttpException, которое возвращает код состояния 403 (несанкционированный доступ), но если вместо этого вы хотите вернуть ActionResult, например RedirectToRoute
или View
, вы можете установить значение для свойства filterContext.Result
.