Аутентификация Windows MVC 5 на уровне AuthorizeAttribute и Service

У меня есть трехуровневое решение MVC: MVC Web — бизнес-уровень — уровень доступа к данным

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

Я могу выполнить аутентификацию и авторизацию, внедрив пользовательский AuthorizeAttribute и запросив уровень обслуживания, существует ли HttpContext.User.Identity.Name в пользовательской таблице, а также проверить разрешения пользователя на основе контроллера и действия.

Однако уровень обслуживания должен повторно авторизовать пользователя при вызове из действия в контроллере. Это позволяет лучше контролировать, что пользователь может и что не может делать — например, некоторые поля доступны только для чтения или скрыты в зависимости от членства в группе пользователей.

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

Это проблема дизайна больше, чем что-либо еще, но я хотел посмотреть, подхожу ли я к проблеме наилучшим образом!


person sjr    schedule 05.06.2017    source источник


Ответы (1)


Если я правильно понимаю ваш вопрос, у вас есть требование проверить права/роли пользователя на вашем сервисном уровне и выполнить некоторую логику на основе этого. Ответ действительно зависит от того, какой тип слоя обслуживания вы используете? Это веб-API или сервисные контракты на основе интерфейса. ЕСЛИ вы используете веб-API, вы можете ввести токен в заголовок авторизации перед вызовом действий контроллера веб-API, что является общей архитектурой для SPA с использованием MVC и Web Api. В этом сценарии веб-API и MVC не нужно размещать на одном сервере, поскольку вы используете подход с токеном-носителем. Если вы используете аутентификацию на основе файлов cookie, это другой случай.

person Himanshu Bhankar    schedule 05.06.2017
comment
Спасибо за ваш ответ @himanshu. На данный момент сервисный уровень представляет собой тесно связанную dll (т.е. прямую ссылку на проект без интерфейсов). Аутентификация — это аутентификация Windows, а имя пользователя передается в качестве параметра метода на уровень службы. В будущем я захочу абстрагировать этот сервисный уровень. Моя проблема в том, что я буду дублировать авторизацию, как я буду делать в AuthorizeAttirbute, а затем снова на уровне службы. - person sjr; 05.06.2017