Идентификация ядра Asp.net Использовать AspNetUserClaims или AspNetRoleClaims?

Я все еще не понимаю, что такое Identity.

Сначала меня все еще смущает разница между ролями, политиками / претензиями. Из того, что я прочитал, роли - это старый способ работы, который был сохранен для обратной совместимости, значит ли это, что AspNetRoleClaims является частью этой обратной совместимости?

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

Если заявлено, то это, по сути, надежный источник, который ручается за этого пользователя (т. Е. Это его возраст, который может быть получен из государственного источника).

Меня смущает то, что я собираю все это вместе.

Я создал таблицы идентичности и вижу

AspNetUsers
AspNetUserRoles
AspNetRoles
AspNetRoleClaims
AspNetUserClaims
AspNetUserLogins

Я понимаю, что делает таблица AspNetUsers и AspNetUserLogins (кажется, если они используют как внешние провайдеры входа в систему).

Я не понимаю, в чем разница между AspNetRoleClaims и AspNetUserClaims. Я просто использую AspNetUserClaims или все?

Скажем, у меня есть этот сценарий

У меня есть компания, у которой много отделений, в каждом отделении они будут администраторами этого отделения, они получили полную власть над отделением и могут делать все, что угодно, но ничего в другом отделении. На уровне компании будет администратор, который сможет делать все, что угодно, на уровне компании и любого филиала. Наконец, у меня есть человек в филиале, который может просто добавлять новых сотрудников.

Как все это выглядит? Я делаю 3 роли?

CompanyAdmin
BranchAdmin
AddUsersAtBranchLevel (or is this some sort of claim??)
What do the tables look like? Is there anything going to be in AspNetRoleClaims? AspNetUserClaims?

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

Или я просто забываю о ролях и имею в AspNetUserClaims

User1   CanAddUserToBranch true
User1 CanDeleteUserBranch true
User1 CanAddUserToCompany true

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

Редактировать

Как вы думаете, мне нужно использовать авторизацию на основе ресурсов?


person chobo2    schedule 17.05.2018    source источник
comment
Вы получили мой голос за то, что я все еще не понимаю, что такое Identity ... Тем не менее, ваш вопрос идеален. Как вы сказали, согласно нескольким достоверным источникам, мы больше не должны использовать роли (в двух словах, есть ошибки 2.1. Для ролей). Тем не менее, единственный текущий ответ ниже рекомендует роли. Большинство вопросов, таких как ваш вопрос о SO, остаются без ответа или снова используются роли ... или устаревший код из более старых версий Identity / Core / и т. Д. ... или разработка Identity и ее настройка. Я весь день смотрю видеоролики msdn и т. Д., Читаю статьи и блоги, но ответ все еще не ясен.   -  person Sum None    schedule 15.06.2018
comment
@SumNone Я был бы признателен за ссылки на достоверные источники, о которых вы упоминаете ... Нет ничего плохого в использовании ролей, если это работает. Роли - это претензии. Вы также можете использовать IdentityCore и создавать собственные утверждения ролей в таблице AspNetUserClaims. Выбирайте то, что лучше всего решает проблему! (пожалуйста, поделитесь ссылками, потому что я не слышал рекомендаций о том, что роли не должны использоваться.)   -  person galdin    schedule 11.01.2019
comment
Проблема в том, что если вы не понимаете одно из решений, трудно выбрать, какое из них решает проблему лучше всего. После долгих исследований я как бы просто сдался и просто сыграл роли (без заявлений о ролях или каких-либо заявлений). Требования того, что было нужно, позволили мне просто использовать роли, так что мне повезло. Я нахожу то же самое, что и SunNone, все рекомендуют не использовать роли (просто прочтите одну из основных книг), но никто не вдавался в подробности о том, как их использовать, и если они это сделают, это такой ограниченный сценарий, что, когда я попытался применив его к своему приложению, я быстро столкнулся с проблемами.   -  person chobo2    schedule 11.01.2019
comment
github.com/aspnet/Docs/issues/7108 Это ссылка, по которой Рик Андерсон вытащил мой вопрос из одного из своих старых примеров кода и сделал его рабочим элементом. Когда вышла последняя версия Identity (в то время ... я думаю, 2.1), роли в основном устарели. Была также пара видеороликов Channel 9 (IIRC), которые вышли с чертовкой, где он это специально сказал. Вот еще одна ссылка об этом: github.com/aspnet/Identity/issues/1813 Я хотел бы, чтобы вы спросили меня еще в июне, я мог бы быть более точным и, вероятно, показать вам, где Blowdart сказал это в видео.   -  person Sum None    schedule 13.01.2019
comment
@gldraphael Пожалуйста, посмотрите мой предыдущий комментарий (я забыл вам ответить). Также: channel9.msdn.com/Blogs/ Сет-Хуарес / Вот дурацкий видеоролик ... В целом он отличный, но начните смотреть через 34 минуты, чтобы услышать о Роли. Есть и второе видео. В общем, я с вами. Вы проповедуете хору. :) Но, начиная новые проекты, я стараюсь следовать последним стандартам и так далее.   -  person Sum None    schedule 13.01.2019
comment
@SumNone спасибо за ссылку на видео. Думаю, я собираюсь открыть вопрос, чтобы спросить об этом на выходных ... Насколько я понимаю, роли не рекомендуются. Они просто пытаются упростить работу, чтобы вы могли отказаться от ненужных вещей. Проблема № 1813 относится к шаблону, использующему AddDefaultIdentity(), который использует IdentityCore, а не все это.   -  person galdin    schedule 24.01.2019


Ответы (1)


+------------------+------------------+
|      Table       |   Description    |
+------------------+------------------+
| AspNetUsers      | The users.       |
| AspNetRoles      | The roles.       |
| AspNetUserRoles  | Roles of users.  |
| AspNetUserClaims | Claims by users. |
| AspNetRoleClaims | Claims by roles. |
+------------------+------------------+
  • A role is something assigned to a user.
    • Eg. Jane is an admin.
  • A claim is something claimed by a user.
    • Eg. Jane's date of birth is 1990-10-1.
  • A role-claim is a claim claimed by a role.
    • Eg. Admins have access to the dashboard.

Если вам кажется, что роли и утверждения сбивают с толку, это, вероятно, связано с тем, что роли - это особый случай утверждений, то есть роли - это утверждения.

Роль или политика

  • Для авторизации на основе ролей система авторизации проверяет, были ли пользователю назначены роли, необходимые для доступа к данному ресурсу.

    • Eg: only users with the Admin role can access the dashboard.
  • Для авторизации на основе политик выполняется некоторая бизнес-логика, чтобы решить, следует ли авторизовать доступ к ресурсам.

    • Eg: only Admins with an age above 40 can access financial data.

Скажем, у меня есть этот сценарий

У меня есть компания, у которой много отделений, в каждом отделении они будут администраторами этого отделения, они получили полную власть над отделением и могут делать все, что угодно, но ничего в другом отделении. На уровне компании будет администратор, который сможет делать все, что угодно, на уровне компании и любого филиала. Наконец, у меня есть человек в филиале, который может просто добавлять новых сотрудников.

Вот один из способов сделать это:

2 роли: Admin, TheRoleThatCanAddUsers
Заявление с именем Branch, которое может принимать идентификатор ветки (или что-либо еще для идентификации ветки). Администраторы компании могут использовать такие значения, как "CompanyWide", 0 или -1.

Теперь создайте политику, которая проверяет роль и утверждение ветви и решает, следует ли авторизовать пользователя.

person galdin    schedule 28.05.2018
comment
Итак, в вашем сценарии вы используете утверждения ролей? Насколько я понимаю, вы используете либо утверждения роли / роли, либо просто утверждения пользователей. Как ты это написал, вроде все используешь? - person chobo2; 29.05.2018
comment
@ chobo2 Нет, я не использовал здесь утверждения ролей. Заявление о ролях имеет смысл, когда требование относится к роли, а не к пользователю. Кроме того, вы можете использовать их все вместе, в зависимости от необходимости. - person galdin; 29.05.2018
comment
Тогда я немного запутался, Вы сделали 2 роли, а Ветвь - это утверждение пользователя? - person chobo2; 30.05.2018
comment
@ chobo2, верно. Потому что ветка может быть разной для каждого пользователя. - person galdin; 30.05.2018
comment
Верно, ветвь имеет смысл, но почему вы решили делать роли, а не просто выдвигать кучу заявлений? Как и в вашей модели, вам нужно будет добавить TheRoleTheCanEditUser, TheRoleThatCanDeleteUsers. Или пожертвуйте этой гибкостью, когда, если бы все было заявлением, у вас не было бы этой проблемы. - person chobo2; 30.05.2018
comment
О да, вы, безусловно, можете использовать претензии, если это так. Роли - это особый случай утверждений, который упрощает использование. Но если гибкость требований имеет больше смысла, дерзайте! - person galdin; 30.05.2018
comment
Да, все еще склоняюсь к этому, хотя я не знаю, есть ли слишком много претензий. Я также все еще не уверен, нужно ли мне что-то вроде аутентификации на основе ресурсов. - person chobo2; 30.05.2018
comment
@ chobo2, извините за поздний ответ. Я бы создал политику (которая использует утверждения) и использовал бы ее для выполнения аутентификации на основе ресурсов - ветвь является ресурсом. - person galdin; 11.01.2019
comment
НАКОНЕЦ! DotNet занимается не только ролями. - person granadaCoder; 04.02.2019
comment
Я отдам свои 2 цента. Вы хотите кодировать проверки по ПРЕТЕНЗИЯМ, а не по ролям. EmployeeAdd, EmployeeEdit, EmployeeDelete, EmployeeViewReadOnly. НЕ проверяйте роли на предмет того, может ли кто-то что-то делать. Теперь вы создаете роль для простой идеи сгруппировать несколько осмысленных утверждений. Роль администратора отдела кадров будет ролью, объединяющей EmployeeAdd, EmployeeEdit, EmployeeDelete, EmployeeViewReadOnly. Затем вы назначаете пользователю N ролей. Мэри играет роль администратора отдела кадров ... Ключевой момент в том, что ваш код проверяет утверждения ... - person granadaCoder; 04.02.2019
comment
и когда вы решите, что вам нужна новая роль, вам НЕ нужно изменять какой-либо код, выполняющий проверку. Кодируя свои проверки в соответствии с ПРЕТЕНЗИЯМИ, вы можете добавлять новые роли, такие как конфеты, НЕ изменяя какой-либо код, который необходимо проверить на функциональность. Если вы поступаете неправильно и кодируете проверки по ролям, то вам придется менять свой код КАЖДЫЙ РАЗ, когда появляется новая роль. Boooooo. Итак, что такое user_to_claims. Если вам нужны разовые претензии для конкретного пользователя, вы можете указать это там. - person granadaCoder; 04.02.2019
comment
В этом руководстве на YouTube показано, как использовать заявки с ролями рядом: youtube.com/watch?v=LJQBBvJ6tL0 < / а> - person Eli; 08.02.2021