Вопрос

Класс моего контроллера украшен атрибутом AuthorizeAttribute для защиты действий:

[Authorize(Roles = "User Level 2")]
public class BuyController : Controller
{
    ...
}

Каждый раз, когда вызывается действие, но пользователь не имеет хотя бы роли «Уровень пользователя 2», он автоматически перенаправляется на страницу входа с таким URL-адресом:

http://localhost:1436/Account/Login?ReturnUrl=%2fBuy

Если пользователь уже вошел в систему, но не имеет нужного уровня безопасности, это не оптимальное поведение!Было бы разумнее отображать страницу, информирующую пользователя об отсутствующем уровне, вместо отображения страницы входа в систему.

Что я могу сделать, чтобы настроить это поведение?Можно ли как-то передать необходимый уровень пользователя действию «Вход»?

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

Решение

Вы можете создать свой собственный атрибут авторизации следующим образом:

public class ClubAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
  base.OnAuthorization(filterContext);
  if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult)
  {
    filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary {
      { "clubShortName", filterContext.RouteData.Values[ "clubShortName" ] },
      { "controller", "Account" },
      { "action", "Login" },
      { "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
    });
  }
}
}

Я использовал это для перенаправления на конкретный клуб на сайте членства в клубе, который я создаю.Вы можете адаптировать это к своим потребностям.Кстати, в моем случае я перенаправляюсь на страницу входа, но проверяю, авторизован ли пользователь, и если да, то показываю сообщение о том, что у него нет правильных разрешений.Без сомнения, вы также можете добавить что-то в ViewData или TempData для отображения на странице, но я этого не пробовал.

РЕДАКТИРОВАТЬAuthorizationContext.Cancel больше не существует в RC.«filterContext.Result is HttpUnauthorizedResult», кажется, достаточно: Что случилось с filterContext.Cancel (ASP.NET MVC)

Другие советы

Время давно прошло с момента последнего ответа.

С 2009 года в сфере авторизации был достигнут большой прогресс.В частности, OASIS (тех, кто стоит за SAML) стандартизировал XACML, расширяемый язык разметки контроля доступа.

XACML дает разработчикам:

  • образец использования
  • архитектура
  • гибкий язык политики авторизации

XACML соответствует управлению доступом на основе атрибутов, которое NIST рекомендует использовать в современных приложениях.

Посмотри на это отвечать Больше подробностей.

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