Настройка авторизации в ASP.NET MVC - PullRequest
26 голосов
/ 09 января 2009

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

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

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

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

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

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

Ответы [ 2 ]

38 голосов
/ 09 января 2009

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

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 для отображения на странице, но я не пробовал это

EDIT AuthorizationContext.Cancel больше не существует в RC. "filterContext.Result is HttpUnauthorizedResult" кажется достаточным: Что случилось с filterContext.Cancel (ASP.NET MVC)

1 голос
/ 21 марта 2014

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

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

XACML предоставляет разработчикам:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...