Это не полный ответ, а только указания. Пожалуйста, оставьте свой код, как только вы закончите эту задачу для следующих поколений.
Кажется, вам нужен фильтр, а не промежуточное ПО, поскольку промежуточное ПО не имеет доступа к данным маршрутизации. Создайте новый фильтр авторизации, унаследовав его от Attribute и реализовав IAuthorizationFilter или IAsyncAuthorizationFilter. Существует только один метод для реализации
public void OnAuthorization(AuthorizationFilterContext context)
{
}
или
public Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
}
Украсьте контроллеры и / или действия, которые вы хотите исключить из этой логики, с помощью AllowAnonymousAttribute . Внутри вашего метода OnAuthorization проверьте, имеет ли текущее действие или контроллер AllowAnonymousAttribute и возвращается ли оно без установки Result для AuthorizationFilterContext. В противном случае выполните логику из вашего оригинального Middleware и установите свойство Result. Результат настройки приведет к короткому замыканию остальной части конвейера фильтра.
Затем зарегистрируйте свой фильтр глобально:
services.AddMvc(options =>
{
options.Filters.Add(new CustomAuthorizeFilter());
});