Авторизация .NET Core — контекст сервисного уровня

Я изучаю .NET Core авторизация и все примеры относятся к контроллерам MVC/WebAPI, которые поддерживают атрибут Authorize.

Мне было интересно, есть ли способ иметь атрибут Authorize для других, «неконтроллерных» методов, чтобы я мог авторизовать вызов определенного метода службы? Я знаю, что нужно иметь авторизацию на уровне доступа (уровень контроллера), но поскольку сервисный уровень должен быть общим, и у нас может быть несколько точек доступа к приложению (не только контроллеры), мой подход заключается в том, чтобы выполнить полную авторизацию внутри контроллеров.

  1. Могу ли я как-то использовать атрибут Authorize в методах сервисного уровня?
  2. Есть ли какая-то служба, которая обеспечивает прямую авторизацию из кода (не обязательно для конкретного ресурса, но, например, проверьте, есть ли у пользователя разрешение Admin.Full - на самом деле то же самое, что и атрибут Authorize, но внутри тела метода)?

person zhuber    schedule 24.09.2019    source источник
comment
Этого ответа должно быть достаточно для начала. Что касается доступа к HttpContext внутри службы, см. IHttpContextAccessor, если вы еще этого не сделали.   -  person Kirk Larkin    schedule 24.09.2019
comment
Я не знал, что у IAuthorizationService были перегрузки без необходимости передавать объект (ресурс). Я посмотрю на это.   -  person zhuber    schedule 24.09.2019
comment
Дайте мне знать, если вам нужна более конкретная помощь.   -  person Kirk Larkin    schedule 24.09.2019
comment
@KirkLarkin Связано с атрибутом авторизации в методах - я думаю, это не поддерживается по умолчанию? Мне нужно создать свой собственный атрибут, а затем перехватить любой вызов определенного класса/интерфейса, проверить атрибуты и затем вызвать поток авторизации, если присутствует атрибут авторизации?   -  person zhuber    schedule 24.09.2019
comment
Нет, не поддерживается. Атрибут Authorize соблюдается только компонентами ASP.NET Core (контроллеры, Razor Pages и т. д.).   -  person Kirk Larkin    schedule 24.09.2019
comment
Вы можете использовать это, чтобы обернуть свои классы в прокси и перехватить методы, основанные на атрибуте - он также полностью не зависит от любых веб-технологий..: github.com/f135ta/SimpleProxy .. (это я написал)   -  person Robert Perry    schedule 24.09.2019
comment
Спасибо, я посмотрю на это, потому что это то, что мне нужно.   -  person zhuber    schedule 24.09.2019