Не забывайте, что во время выполнения уже встроена абстрактная система безопасности / пользовательская система - принципал (см. Этот существующий ответ - обратите внимание, что GenericIdentity
- это всего лишь один вариант; это довольно тривиально для написать свой собственный).
Ваш пользовательский интерфейс может обрабатывать создание и назначение принципала на основе конкретной реализации (действительно, IIRC ASP.NET и WCF делают это автоматически, или для winforms / wpf вы можете использовать идентификатор Windows, или (через веб-сервис) тот же логин ASP.NET).
Ваша бизнес-логика просто проверяет Thread.CurrentPrincipal
; из этого вы можете получить имя, метод аутентификации и проверить роли (без необходимости знать, как реализованы роли).
Среда выполнения также предоставляет встроенные проверки:
[PrincipalPermission(SecurityAction.Demand, Role = Roles.Admin)]
public void Foo() {...}
(где Roles.Admin
- строковая константа имени вашей роли). Это автоматически проверит доступ, выдав SecurityException
, если не в роли. Вы также можете проверить с помощью кода (полезно, если роль не зафиксирована во время компиляции).
Очевидно, что ваш пользовательский интерфейс должен проверять роли (чтобы отключить / скрыть функциональность), но хорошо иметь бизнес-код , обеспечивающий роли, без необходимости знать о пользовательском интерфейсе.
* * Тысяча двадцать-одина (добавлено) * * 1 022
Следует отметить, что GenericIdentity
удобен для юнит-тестов. Конечно, вы могли бы использовать свой собственный API безопасности, и никто не остановит вас ...