Дозволи / правильна модель / шаблон для додатка .NET


9

Мені потрібно реалізувати гнучку І просту (якщо така є) і в той же час використовувати вбудовані засоби, якщо це можливо

Поки що у мене реалізовані MembershipProvider та RoleProviders. Це круто, але куди мені піти далі?

Я відчуваю, що мені потрібно додати термін "Priviledge" і чим жорсткий код тих, хто всередині програми. Користувачі налаштовуватимуть ролі, щоб додати Privilidges до ролей та призначити Ролі користувачам.

Це звучить як гарна модель? Чи варто задуматися над тим, щоб додати привілеї на рівні користувача поверх додавання їх до ролей? Можливо, але я передбачу проблеми з налаштуванням (заплутаність) та наступною підтримкою.

Якщо я цього не роблю, а деяким конкретним користувачам знадобляться менші права - адміністратору доведеться створити іншу роль тощо.

Будь-яка срібна куля для такої системи? І чому Microsoft не пішла далі, ніж лише провайдери членства та ролей?

Ще одна ідея: залиште Ролі як "привілей" власника та введіть їх жорстким кодом. Тоді я можу кодувати ці ролі всередині програми, використовуючи всі доступні розмітки / атрибути тощо - всі Microsoft.

Додайте нову сутність "Групу" та створіть такі відносини

  • Користувачі
  • UserGroups
  • Групи
  • Рольові групи
  • Ролі

Таким чином я можу збирати ролі в групи та призначати ці групи користувачам. Звучить чудово і відповідає іншим моделям програмного забезпечення. Але тоді я не можу реально реалізувати речі всередині RoleProvider:

  • AddUsersToRoles
  • RemoveUsersFromRoles

А деякі речі насправді вже не мають сенсу, оскільки вони будуть жорстко закодовані

  • DeleteRole
  • CreateRole

Відповіді:


5

Якщо авторизація на основі ролі для вас недостатньо детальна, тоді ви можете використовувати Авторизацію на основі претензій .

Претензія описує ресурс та діяльність - на зразок запису в ACL, але більш гнучкої, оскільки "ресурс" не повинен бути фізичним об'єктом, він може бути будь-яким, що ви хочете, і він може містити будь-яку інформацію ти хочеш.

У цій моделі претензія еквівалентна тому, що ви називаєте "привілеєм", і ви групуєте претензії в набори претензій, що приблизно еквівалентно тому, що ви називаєте "роллю". Усі ці API та багато іншого вже є в System.IdentityModelпросторі імен.

Звичайно, ви згадуєте, MembershipProviderі RoleProviderякщо ви намагаєтеся все це зафіксувати у моделі членства в ASP.NET (як випливають з цих імен), просто забудьте про це. Якщо ви хочете використовувати API цих провайдерів, тоді вам доведеться робити це так, і їх спосіб не отримує більш детальної форми, ніж поняття ролі.

Натомість в ASP.NET поняття "привілей" фактично кодується на рівні дії чи операції , де ви заявляєте, які ролі дозволяють виконувати цю дію. Це дійсно набагато простіше вирішити в ASP.NET MVC, де ви просто ляпаєте [AuthorizeAttribute]контролери чи дії контролера; у ASP.NET "old school" ви обробляєте події, тому авторизація має тенденцію бути або тимчасовою, або на рівні сторінки (або обох).


Багато чудової інформації, дякую! Додаток - насправді додаток Silverlight з частиною сервера, яка піддається WCF RESTful service. На основі претензій виглядає цікаво, але я не помітив поняття користувача та авторизації всередині нього. Цікава стаття, яку я щойно знайшов: geekswithblogs.net/shahed/archive/2010/02/05/137795.aspx
katit

@katit: Практично вся автентифікація / авторизація в .NET базується на інтерфейсі IPrincipal . Якщо ви робите авторизацію на основі тверджень , то ви використовуєте IClaimsPrincipal для цього, і кинули IPrincipalв , IClaimsPrincipalколи ви хочете зробити позовні чеки. Ви будете писати багато власного коду, якщо хочете вписати його у (наприклад) Аутентифікацію форм, але, очевидно, це можна зробити (за посиланням).
Aaronaught

питання в тому .. Можливо, простіше просто додати ще один рівень "Групи" до постачальників / ролей або написати власного провайдера? Приблизно стільки ж роботи, як і впровадження Microsoft
katit

3
@katit: Останні відомі слова. Не вигадуйте власне, якщо у вас немає дуже вагомих причин вигадувати своє ("здається, що простіше" - це не вагома причина; це здається легше лише тоді, коли ви не мали прямого досвіду і, отже, не маєте можливості судити про судження кількість необхідної роботи).
Aaronaught
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.