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

Рекомендации по ролям и претензиям в ASP.NET Identity

Я совершенно не знаком с использованием claims в ASP.NETIdentity и хочу получить представление о лучших методах использования Roles and/or Claims.

После всего этого чтения у меня все еще есть такие вопросы, как...

Q: Мы больше не используем роли?
Q: Если да, почему все еще предлагаются роли?
В: Должны ли мы использовать только претензии?
В: Должны ли мы использовать роли и претензии вместе?

Моя первоначальная мысль заключается в том, что мы "должны" использовать их вместе. Я вижу claims как подкатегории для Roles, которые они поддерживают.

ДЛЯ ПРИМЕРА:
Роль: учет
Претензии: CanUpdateLedger, CanOnlyReadLedger, CanDeleteFromLedger

Q: Они должны быть взаимоисключающими?
Вопрос: Или лучше обратиться к претензиям ТОЛЬКО и "полностью квалифицировать" свои претензии?
Q: Итак, какие здесь лучшие методы?

ПРИМЕР: Использование ролей и претензий вместе
Конечно, вам нужно написать свою собственную логику атрибутов для этого...

[Authorize(Roles="Accounting")]
[ClaimAuthorize(Permission="CanUpdateLedger")]
public ActionResult CreateAsset(Asset entity)
{
    // Do stuff here

    return View();
}

ПРИМЕР: Полностью квалифицировать ваши претензии

[ClaimAuthorize(Permission="Accounting.Ledger.CanUpdate")]
public ActionResult CreateAsset(Asset entity)
{
    // Do stuff here

    return View();
}
4b9b3361

Ответ 1

Роль - это символическая категория, которая объединяет пользователей, которые имеют одинаковые уровни привилегий безопасности. Для авторизации на основе ролей требуется сначала определить пользователя, затем определить роли, которым назначен пользователь, и, наконец, сравнить эти роли с ролями, которым разрешен доступ к ресурсу.

Напротив, претензия является правом пользователя идентифицировать себя. Другими словами, "мне разрешено делать это, потому что у меня есть это требование". В целом авторизация на основе утверждений включает авторизацию на основе ролей. Точнее, членство в ролях определяется на основе идентичности, а идентификация - это всего лишь один вид права на стоимость требования. Роли по существу являются очень конкретным видом требований, то есть "Поскольку мое имя пользователя является этим, я являюсь участником этой роли. Поскольку я являюсь членом этой роли, у меня есть доступ к этому ресурсу".

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

Ответ 2

Как прекрасно объяснил @Claies, претензии могут быть более описательными и играть важную роль. Я думаю о них как о ваших ролях. У меня есть тренажерный зал, поэтому я принадлежу к роли членов. Я также на уроках кикбоксинга, поэтому у меня есть претензии к ним; идентификатор кикбоксинга. Моему заявлению потребуется объявление новой роли, чтобы соответствовать моим правам на членство. Вместо этого у меня есть идентификаторы для каждой особой вещи, которую я могу сделать в спортзале; вместо множества новых типов членства. Вот почему претензии подходят мне лучше.

Есть отличное видео объяснения Барри Дорранса, рассказывающего о преимуществах использования претензий над ролями. Он также заявляет, что роли все еще находятся в .NET для обратной совместимости. Это видео очень информативно о том, как работают заявки, роли, политики, авторизация и аутентификация.

Вы можете найти его здесь: ASP.NET Core Authorization с Barr Dorrans

Ответ 3

В течение десятилетий использовались различные методы аутентификации и авторизации, в моем текущем приложении MVC используется следующая методология.

Претензии используются для всех авторизации. Пользователям назначается одна роль (возможно несколько ролей, но мне это не нужно) - подробнее ниже.

Как правило, используется класс атрибутов ClaimsAuthorize. Поскольку большинство действий контроллера являются CRUD, у меня есть подпрограмма в генерации базы данных с первым кодом, которая повторяет все действия контроллера и создает типы заявок для каждого атрибута действия контроллера Read/Edit/Create/Delete. Например. из,

[ClaimsAuthorize("SomeController", "Edit")]
[HttpPost]

Для использования в MVC View базовый класс контроллера представляет элементы пакета представления

        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // get user claims
            var user = filterContext.HttpContext.User as System.Security.Claims.ClaimsPrincipal;

            if (user != null)
            {
                // Get all user claims on this controller. In this controler base class, [this] still gets the descendant instance type, hence name
                List<Claim> claims = user.Claims.Where(c => c.Type == this.GetType().Name).ToList();

                // set Viewbag with default authorisations on this controller
                ViewBag.ClaimRead = claims.Any(c => c.Value == "Read");
                ViewBag.ClaimEdit = claims.Any(c => c.Value == "Edit");
                ViewBag.ClaimCreate = claims.Any(c => c.Value == "Create");
                ViewBag.ClaimDelete = claims.Any(c => c.Value == "Delete");
            }

            base.OnActionExecuting(filterContext);
        }

Для меню веб-сайта и других неконтроллерных действий у меня есть другие претензии. Например. может ли пользователь просматривать конкретное денежное поле.

bool UserHasSpecificClaim(string claimType, string claimValue)
{
    // get user claims
    var user = this.HttpContext.User as System.Security.Claims.ClaimsPrincipal;

    if (user != null)
    {
        // Get the specific claim if any
        return user.Claims.Any(c => c.Type == claimType && c.Value == claimValue);
    }

    return false;
}

public bool UserHasTradePricesReadClaim
{
    get
    {
        return UserHasSpecificClaim("TradePrices", "Read");
    }
}

Итак, где вписываются роли?

У меня есть таблица, которая связывает роль с (по умолчанию) набором требований. При настройке авторизации пользователя по умолчанию пользователь получает утверждения о своей роли. У каждого пользователя может быть больше или меньше претензий, чем по умолчанию. Чтобы упростить редактирование, список претензий показывается контроллером и действиями (подряд), а затем перечисляются другие претензии. Кнопки используются с небольшим количеством Javascript для выбора набора действий, чтобы минимизировать "щелчки", необходимые для выбора утверждений. При сохранении заявки пользователей удаляются, а все выбранные заявки добавляются. Веб-приложение загружает заявки только один раз, поэтому любые изменения должны вызывать перезагрузку этих статических данных.

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

Ответ 4

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

1- на вашем сайте должно быть два модуля (страницы, сервис.. и т.д.): Первый модуль для ребенка (до 18 лет), другой для взрослых (старше 18 лет) у вашей личности есть претензия на день рождения

вам нужно создать политику для этой заявки, чтобы авторизация для каждого модуля была предоставлена на это значение, и если возраст пользователя превышает 18 лет, то он может перейти на модуль для взрослых, а не до этого возраста

Роль - это логический тип данных, который вы можете иметь или не иметь роль роль не имела солодовых ценностей

2- у вашего сайта есть роль пользователя, и вы не хотите препятствовать доступу пользователей к некоторому обслуживанию без изменения кода

в утверждениях вы можете создать политику UnderConstrain, которая, если истинный пользователь не может просматривать страницу, дает свойство authorize для пользователя роли.