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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

В общем, фильтры делаете, авторизации, или на действия, там делайте что хотите.
...
Рейтинг: 0 / 0
10.07.2018, 12:01
    #39671992
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
Типа того:
Код: 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
10.07.2018, 12:03
    #39671993
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AspNetCore. Как в Middleware узнать наличие фильтра у вызываемого метода ?
hVosttWaspNewCoreТам есть уже хорошая авторизация с блекжеком. Данный аттрибут в хэдере чисто визуальщина, пожелание от менеджеров проекта руководства )

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

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

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

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

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

Пример выше.

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

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

В middleware.

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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

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


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