powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
25 сообщений из 25, страница 1 из 1
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671529
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.
Мне необходимо в Middleware проверять наличие IAllowAnonimous фильтра у вызываемого роута. Как это можно сделать ?

Пробовал через
Код: c#
1.
 _httpContextAccessor.HttpContext.Features.Get< IAllowAnonimous > ()


но там его не оказалось почему-то. Также думал выйти на него через
Код: c#
1.
_httpContextAccessor.HttpContext.Features.Get< IHttpAuthenticationFeature> ()


с последующим поисков в этом списке, но также не нашел.

Как это можно решить ?
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671576
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,

В middleware атрибуты действий и контроллеров недоступны, так как они действуют в middleware, реализующим MVC, соответственно ни до, ни после -- их нет, так как в middleware нет ни контроллеров, ни действий, это лишь абстракции паттерна.

Все операции, которые вы хотите внедрить в работу MVC pipeline делаются фильтрами , а не middleware.

Если вы расскажите, чего вы в конечном счёте хотите, может быть найдём решение.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671585
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, что откликнулись.

Хочу сделать следующее:
В Header задается некий кастомный аттрибут - строковый ID. Он считывается отдельным Middlewar'ов и записывается в scoped сервис как константа. Этот сервис потом инжектится в репозитории, и служит неким глобальным фильтром в условии where. Он не привязан к юзеру. Юзер в начале работы выбирает этот scoup и в нем работает. При этом, если этого аттрибута в хэдере нету, то вываливается ошибка 401. Это некое подобие роли или некий код Area, в которой работает юзер в данной сессии. Даный функционал переделать нельзя - не получится перенести его куда-то в профиль юзера или еще что-то. Т.е. исходные данные таковы, а дальше я уже могу работать.

Я хочу сделать кастомный аттрибут [NoId], который должен отслеживаться Middleware'ом и при его наличии он не должен пытаться считать его из Header . Даже если он есть (случайно пришел или не случайно). Соответственно не должен пытаться протолкнуть его в scoped сервис, который будут дальше использовать.

Получается некий аналог аттрибута AllowAnoimous.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671594
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе, может сделать это через фильтр ?
Чтобы фильтр считывал хэдер и записывал его куда нужно. А еще сделать NotFilter (его антипод), который бы игнорировал этот хэдер.

При этом сконфигурировать, чтобы основной фиьтр применялся по умолчанию ко всем методам. Соответсвенно его антипод будет нейтрализовывать наличие первого.

Вот только как это сделать, чтобы фильтр антипод отключал работу основного ? Наверное в основном можно, таки, получить доступ к примененным фильтрам (то, что я и хотел сделать изначально) и просто ничего не делать при наличии фильтр антипода ? Т.е. фильтр антипод выступает в роли маркерного интерфейса.

так ?
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671652
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,

Вам нужно сделать свой фильтр авторизации, который авторизует или нет пользователя глядя на заголовок запроса. Но учтите, что пользователь может подсунуть любой хедер, какой пожелает, поэтому безопасность таки должна делаться в момент авторизации, записываться в тикет, а не аналог аноимус юзер, это фигня.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671653
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreЭтот сервис потом инжектится в репозитории, и служит неким глобальным фильтром в условии where.репо самописка?
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671654
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttсвой фильтр авторизации, который авторизует или нет пользователя глядя на заголовок запроса

И бросать его на действия или контроллеры.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671916
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttWaspNewCore,

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

Там есть уже хорошая авторизация с блекжеком. Данный аттрибут в хэдере чисто визуальщина, пожелание от менеджеров проекта руководства )


Petro123,
Да простенький репо. Чисто для инжекции.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671926
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreСпасибо, что откликнулись.

Хочу сделать следующее:
В Header задается некий кастомный аттрибут - строковый ID. Он считывается отдельным Middlewar'ов и записывается в scoped сервис как константа. Этот сервис потом инжектится в репозитории, и служит неким глобальным фильтром в условии where. Он не привязан к юзеру. Юзер в начале работы выбирает этот scoup и в нем работает. При этом, если этого аттрибута в хэдере нету, то вываливается ошибка 401. Это некое подобие роли или некий код Area, в которой работает юзер в данной сессии. Даный функционал переделать нельзя - не получится перенести его куда-то в профиль юзера или еще что-то. Т.е. исходные данные таковы, а дальше я уже могу работать.

Я хочу сделать кастомный аттрибут [NoId], который должен отслеживаться Middleware'ом и при его наличии он не должен пытаться считать его из Header . Даже если он есть (случайно пришел или не случайно). Соответственно не должен пытаться протолкнуть его в scoped сервис, который будут дальше использовать.

Получается некий аналог аттрибута AllowAnoimous.
Не понял при чём тут аттрибут AllowAnoimous.

"В Header задается некий кастомный аттрибут - строковый ID. Он считывается отдельным Middlewar'ов и записывается в scoped сервис как константа." - то есть работа ведётся в контексте некого ID, что пишется в сервис.
Дак и расширте этот свой сервис свойствам IsAnonymous и используйте.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671932
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И кстати не понятно зачем тут вообще middleware?

В конструктор этого Вашего сервиса заинжектить IHttpContextAccessor и пусть он сам достаёт нужные ему кастомные атрибуты.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671981
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВ конструктор этого Вашего сервиса заинжектить IHttpContextAccessor и пусть он сам достаёт нужные ему кастомные атрибуты.

Он там их не достанет. Контроллеры, действия, области -- это область действия MVC, аспекты доступны только в фильтрах MVC, но никак через HttpContext. Максимум, можно поковыряться в RouteData и извлечь там имена контроллеров. Можно конечно поковырять типы и самому извлечь атрибуты, но это полный трешак, так делать нельзя.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671983
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreТам есть уже хорошая авторизация с блекжеком. Данный аттрибут в хэдере чисто визуальщина, пожелание от менеджеров проекта руководства )

В общем, фильтры делаете, авторизации, или на действия, там делайте что хотите.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671992
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типа того:
Код: c#
1.
2.
3.
4.
5.
6.
public interface ISecurityContext
{
        bool IsAnonymous { get; }

        string UserRole { get; }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
using Microsoft.AspNetCore.Http;
using System.Linq;

public class SecurityContext : ISecurityContext
{
    private readonly bool anonymous;
    private readonly string userRole;

    public bool IsAnonymous => anonymous;

    public string UserRole => userRole;

    public SecurityContext(IHttpContextAccessor context)
    {
        var headers = context.HttpContext.Request.Headers;

        headers.TryGetValue("X-IsAnonymous", out var anonymousValues);
        int.TryParse(anonymousValues.FirstOrDefault(), out anonymous);

        headers.TryGetValue("X-UserRole", out var userRoleValues);
        int.TryParse(userRoleValues.FirstOrDefault(), out userRole);
    }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
class SomeRepository : ISomeRepository
{
    private readonly ISecurityContext securityContext;

    public SomeRepository(ISecurityContext securityContext)
    {
        this.securityContext = securityContext;
    }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddHttpContextAccessor();

    // Register application services.
    services.AddScoped<ISecurityContext, SecurityContext>();
    services.AddScoped<ISomeRepository, SomeRepository>();
}
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671993
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttWaspNewCoreТам есть уже хорошая авторизация с блекжеком. Данный аттрибут в хэдере чисто визуальщина, пожелание от менеджеров проекта руководства )

В общем, фильтры делаете, авторизации, или на действия, там делайте что хотите.
А вот это?
Конвейер или как правильно термин?
https://docs.microsoft.com/ru-ru/aspnet/core/fundamentals/middleware/?view=aspnetcore-2.1&tabs=aspnetcore2x
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39671994
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAВ конструктор этого Вашего сервиса заинжектить IHttpContextAccessor и пусть он сам достаёт нужные ему кастомные атрибуты.

Он там их не достанет...
Почему не достанет?

Я так понял, что передаётся некий кастомный заголовок в запросе, что определяет роль пользователя.
И нужно выбирать данные в контексте данной роли.

Пример выше.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39672013
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПочему не достанет?

Я так понял, что передаётся некий кастомный заголовок в запросе, что определяет роль пользователя.
И нужно выбирать данные в контексте данной роли.

Пример выше.

Ты кажись вообще ничего не понял

Речь идёт не о том, как достать заголовок, а как проверить, есть ли у текущего действия или контроллера атрибут [AllowAnonymous].

В middleware.

А ты предложил какую-то обёртку, чтобы достать значения хедеров. Честно говоря, здесь бы подошло пару методов расширения для HttpContext, зачем вот это вот городить?
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39672014
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,


WaspNewCoreЯ хочу сделать кастомный аттрибут [NoId], который должен отслеживаться Middleware'ом и при его наличии он не должен пытаться считать его из Header . Даже если он есть (случайно пришел или не случайно). Соответственно не должен пытаться протолкнуть его в scoped сервис, который будут дальше использовать.

Т.е. он уже решил задачу пихать свой ID из хедеров в скоуп.

А теперь как сделать, чтобы на некоторых маршрутах его игнорировать с помощью атрибута.
Под маршрутом понимается действие контроллера, так как только там можно применить атрибут, как аспект действия.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39672049
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

читаем выделенное:
WaspNewCoreСпасибо, что откликнулись.

Хочу сделать следующее:
В Header задается некий кастомный аттрибут - строковый ID . Он считывается отдельным Middlewar'ов и записывается в scoped сервис как константа . Этот сервис потом инжектится в репозитории, и служит неким глобальным фильтром в условии where. Он не привязан к юзеру. Юзер в начале работы выбирает этот scoup и в нем работает. При этом, если этого аттрибута в хэдере нету, то вываливается ошибка 401. Это некое подобие роли или некий код Area, в которой работает юзер в данной сессии. Даный функционал переделать нельзя - не получится перенести его куда-то в профиль юзера или еще что-то. Т.е. исходные данные таковы, а дальше я уже могу работать.

Я хочу сделать кастомный аттрибут [NoId], который должен отслеживаться Middleware'ом и при его наличии он не должен пытаться считать его из Header . Даже если он есть (случайно пришел или не случайно). Соответственно не должен пытаться протолкнуть его в scoped сервис, который будут дальше использовать.

Получается некий аналог аттрибута AllowAnoimous.
Объясни, что такое Header? Что такое кастомный атрибут - строковый ID? Раз ты до конца понял автора
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39672059
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Он походу одними и теми же терминами называет разные вещи

Но не суть.
Моя идея в том, что если уж сейчас вызывающая сторона определяет контекст, передавая заголовки, то пусть она и продолжает это делать.

То есть типа если я дёргаю этот url из-под админа, то сервис отдаёт мне данные без лишних фильтров.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39672087
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAОбъясни, что такое Header? Что такое кастомный атрибут - строковый ID? Раз ты до конца понял автора

Да вроде понятно.
Он хочет при наличии атрибута [NoId] игнорировать какую-то фигню из Header.
Доступ к атрибуту из middleware он получить не может, это само собой разумеется, так как его нужно реализовывать в виде фильтра инфраструктуры MVC.

А что такое "кастомный аттрибут -- строковый ID" это какая-то фигня, которая задаётся в хедерах.

Т.е. когда я просил озвучить конечную задачу, автор озвучил вместо этого потроха реализации, как он это понимает.


skyANAМоя идея в том, что если уж сейчас вызывающая сторона определяет контекст, передавая заголовки, то пусть она и продолжает это делать.

Эмм.. заголовками? Или типа &ignoreAuthFilter=true ?


skyANAТо есть типа если я дёргаю этот url из-под админа, то сервис отдаёт мне данные без лишних фильтров.

Вообще, это вопрос авторизации, а не каких-то заголовков.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39672099
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

я так понял, что в заголовке передаётся параметр, что определяет из под какой роли дёргается сервис
если не передали, то 401 Unauthorized

по идее надо завести некую супер-пупер роль, которой данные отдавать без ограничений

а он почему-то хочет и текущий механизм оставить, и сбоку костыль прикрутить
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39672102
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВообще, это вопрос авторизации, а не каких-то заголовков.
Слушай, если запихать в Authorization заголовок JWT Token, то у тебя вопросов думаю не возникнет.

А вот они сделали свою кастомщину
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39672152
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt меня понял верно. Благодаря объяснению, что аттрибуты применяемые к контроллерам обрабатываются MVC мидлваром и не имеют смысла для других мидлваров, в голове все встало на свои места.

Переписываю на IAsyncResourceFilter, вроде получается. Ничего сложного. Просто не туда копал изначально. Можно закрывать тему :) Спасибо.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39672281
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAя так понял, что в заголовке передаётся параметр, что определяет из под какой роли дёргается сервис
если не передали, то 401 Unauthorized

Честно говоря, даже с твоим объяснением, конечную задачу я не совсем понимаю :)

skyANAпо идее надо завести некую супер-пупер роль, которой данные отдавать без ограничений
а он почему-то хочет и текущий механизм оставить, и сбоку костыль прикрутить

Или входить с определённым Claim, на которых можно строить свои политики и рулить атрибутами.
...
Рейтинг: 0 / 0
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
    #39672282
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAСлушай, если запихать в Authorization заголовок JWT Token, то у тебя вопросов думаю не возникнет.

Нет конечно, там просто надо проверить подпись :)
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]