Вы должны хранить все элементы членства внутри уровня представления (контроллера).Предположим, что вы когда-нибудь захотите добавить еще один уровень представления (или внести изменения в существующий уровень), вам будет трудно это исправить.Кроме того, вы дублируете код между уровнем представления и уровнем служб, что никогда не является хорошей идеей.
Сказав это, нет причин не выполнять проверки безопасности на уровне служб, но вы можете сделать этобез необходимости использовать классы членства.Прежде всего, аутентифицированный в данный момент пользователь доступен из Thread.CurrentPrincipal
(внутри методов уровня сервиса).Вы можете использовать это IPrincipal
для выполнения проверок безопасности.
Во-вторых, вы можете использовать PrincipalPermissionAttribute
для применения правил безопасности в методах или классах уровня обслуживания.,Например:
[PrincipalPermission(SecurityAction.Demand, Role="Administrator")]
public void MySecureServiceLayerMethod()
{
var p = Thread.CurrentPrincipal;
....
}
Для работы с ролями вам также необходимо использовать реализацию RoleProvider
.
ОБНОВЛЕНИЕ : Как поясняет Уайетт Барнетт в комментарии, использование PrincipalPermission
имеет ряд недостатков.Прежде всего, тестирование вашего кода становится более сложным.Еще один (больший) недостаток заключается в том, что вы жестко кодируете имена ролей в своем коде.Эти имена обычно не принадлежат разработчику.