Подтвердить что ты не робот

Настройка авторизации в ASP.NET MVC

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

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

В любое время, когда действие вызывается, но пользователь не входит, по крайней мере, в роль "Пользовательский уровень 2", он автоматически перенаправляется на страницу входа с URL-адресом, подобным этому:

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

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

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

4b9b3361

Ответ 1

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

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 - HttpUnauthorizedResult", кажется, достаточно: Что случилось с filterContext.Cancel(ASP.NET MVC)

Ответ 2

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

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

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

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

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

Посмотрите на этот ответ для более подробной информации.