Атрибут ASP.NET Authorize и роль администратора - PullRequest
8 голосов
/ 10 августа 2011

Используя атрибут Authorize, я могу указать роли, которым разрешен доступ к ресурсам.

[Authorize(Roles="User")]

Но если у меня есть администратор, которому разрешен доступ к любому ресурсу, мне нужно указать и этот.

[Authorize(Roles="User, Administrator")]

Но, может быть, есть какой-то способ, которым я могу как-то сказать, что Администратору разрешено идти куда угодно, а не указывать это в атрибуте Authorize?

Так что я имею в виду, если где-то в коде ( на контроллере или на действии ) будет [Authorize(Roles="User")], это означает, что роль администратора также разрешена.

Или, может быть, я могу установить его для всех Авторизовать роли динамически, как при запуске приложения?

Есть идеи?

ОБНОВЛЕНО:

В настоящее время у меня есть одинконтроллер администратора с атрибутом Authorize [Authorize(Role="Administrator")], и у меня есть некоторые действия в других контроллерах с атрибутами [Authorize(Role="User")], поэтому мне нужно будет добавить туда "Administrator", если я не нашел лучшего решения.

Ответы [ 5 ]

2 голосов
/ 27 марта 2012
[Authorize(Roles = "User, Admin")]
public class PrestamosController : Controller
{
    // controller details
}
2 голосов
/ 10 августа 2011

Я думаю, что это будет работать для вас. Создайте свой собственный базовый контроллер с помощью AuthorizeAttribute, а затем заставьте другие контроллеры наследовать ваш базовый класс.

[Authorize(Roles="Admin")]
public class MyFancyController : Controller
{
}

[Authorize(Roles = "TaxPayer")]
public class WizardController : MyFancyController
{
...

Хотя, на мой взгляд, это страшно.

Сколько контроллеров / действий у вас есть? Что если вы забудете об этом позже и, возможно, у вас будет страница, к которой вы не хотите, чтобы администраторы обращались?

Отладка кода станет более сложной?

1 голос
/ 10 августа 2011

Вы можете создать собственный фильтр и использовать его для украшения ваших действий или контроллеров.Это простая структура, которую я использовал довольно часто:

public class AuthorizationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
            filterContext.Result = new HttpUnauthorizedResult();
            return;
        }

        var actionName = filterContext.ActionDescriptor.ActionName; 
        var controllerName = filterContext.Controller.GetType().Name;

        bool isAuthorized =false;

        // Put your logic here !!!!

        if (!isAuthorized)  {
            filterContext.Result = new HttpUnauthorizedResult();        
            return;
        }
    }
}

Вы можете прочитать больше здесь

0 голосов
/ 22 июня 2017

Вам нужна концепция Статическая роль и Роль времени выполнения . Вот простой пример:

Ваш список ролей и их уровни:

  • Роль: Admin | Уровень: 1
  • Роль: редактор | Уровень: 2
  • Роль: Зритель | Уровень: 3

Пользователи и их статическая роль (статическая роль - это роль, назначенная вами пользователям):

  • Пользователь: John | Роль: Admin
  • Пользователь: Sam | Роль: Редактор
  • Пользователь: Peter | Роль: Зритель

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

  • Пользователь: John | Роль: Администратор, Редактор, Просмотр
  • Пользователь: Sam | Роль: редактор, просмотрщик
  • Пользователь: Peter | Роль: Зритель

И затем вы можете просто использовать [Authorize (Roles = "Viewer")], пользователи с более высоким уровнем разрешений (например, Джон, Сэм) также могут получить к нему доступ. Потому что они также должны иметь роль средства просмотра во время выполнения.

Смысл использования статической роли и роли времени выполнения состоит в том, что статическая роль облегчает назначение роли. А роль времени выполнения облегчает авторизацию ресурсов.

0 голосов
/ 17 апреля 2014

Это то, что я делаю: убедитесь, что пользователи с ролью «Администратор» также находятся в роли «Пользователь».

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