Мне удалось найти рабочее решение для этого, которое я в настоящее время тестировал со страницами, а не с контроллерами и представлениями.
Необходимые интерфейсы
IActionDescriptorCollectionProvider
- Предоставляет список всех страниц Razor. PageLoader
- Загружает страницу Razor, разрешает ее политики безопасности и атрибуты класса. IAuthorizationService
- Определяет, является ли пользовательавторизованный к политике.
Шаги
Получить список всех страниц бритвы.
var pageDescriptors = _descriptorProvider.ActionDescriptors.Items
.OfType<PageActionDescriptor>()
.ToArray();
Перебрать страницы и загрузитькаждый из них:
var compiledPage = await _pageLoader.LoadAsync(pageDescriptor);
На этом этапе вы можете выполнить некоторую обработку на основе атрибутов, добавленных в модель страницы. Обратите внимание, что любой атрибут, который вы добавляете в класс модели страницы, будет автоматически разрешен в EndpointMetadata
, нет необходимости выполнять пользовательскую работу по отражению!
var pageMetadata = compiledPage.EndpointMetadata
.OfType<PageMetadataAttribute>() // My custom attribute.
.FirstOrDefault();
Обратите внимание, что политики и авторизациябудет добавлен к метаданным страницы Razor в виде AuthorizeAttribute
экземпляра.
Извлеките атрибуты авторизации, выполните их цикл и оцените.
var authorization = compiledPage.EndpointMetadata
.OfType<AuthorizeAttribute>()
.ToArray();
foreach (var auth in authorization)
{
if (!string.IsNullOrEmpty(auth.Policy))
{
var authResult = await _authorizationService.AuthorizeAsync(
_httpContextAccessor.HttpContext.User,
auth.Policy);
if (!authResult.Succeeded) return; // Do stuff here.
}