powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Хранение метки пользователя, совершившего операцию
25 сообщений из 32, страница 1 из 2
Хранение метки пользователя, совершившего операцию
    #39912564
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, у меня есть solution, которое состоит из 3 проектов
1)Models-dll- с моделями сущностей
2)Data-dll - вся тема с EntityFramework Core 3.0
3)Web- web api приложение.

Есть сущность накладная- не суть важно какая она- есть номер, есть дата создания и тд.
Модель накладной (Invoice) описывается в проекте Models
В проекте Data я создаю таблицу с накладными

Код: c#
1.
 public DbSet<Invoice> Invoices { get; set; }



Разделение слоев логики я выдерживал нормально, пока мне не пришлось реализовать следующий функционал.
Накладную могут печатать разные пользователи, и нужно отслеживать кто-какую накладную напечатал.
Соответственно к сущности Invoice нужно добавлять свойство IdentityUser из пространства Microsoft.AspNetCore.Identity.
И мой девственно чистый от зависимостей проект Models получает вливание Microsoft.AspNetCore пакета и все предыдущее разделение слоев окажется насмарку. Как можно обыграть ситуацию, чтобы не размазывать зависимости по всему решению?
Единственный вариант, который приходит в голову, это хранить в свойствах Invoice не IdentityUser, а его Guid, но EF Core, по моему не позволяет использовать такую технику.
Спасибо
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39912571
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,

.. так а когда контроллер web-api вызывает сервис, он разве не может передать туда параметр ("Вася_Пупкин_первопечатник") .?
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39912595
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хранить это в отдельной таблице, в которой будет информация какую накладную, какой пользователь, когда и т.д. распечатал
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39912740
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
И мой девственно чистый от зависимостей проект Models получает вливание Microsoft.AspNetCore пакета и все предыдущее разделение слоев окажется насмарку. Как можно обыграть ситуацию, чтобы не размазывать зависимости по всему решению?


Пакет Microsoft.AspNet.Identity.Core не имеет никаких внешних зависимостей, чего вы там размазываете не пойму?
Если используете Identity, модель должна знать об этих сущностях, почему вы пытаетесь их скрыть?

Проблемы не вижу.
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39912849
L.Otujktd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub,

Добавить сущность описывающую процесс распечатывания и записывать туда Ваш invoice и id пользователя. Можно даже добавить класс InvoiceAudit со ссылкой на Invoice, тип операции и пользователя, например в отдельную сборку Audit. В таком случае в Models нет необходимости ссылаться на сборку с Identity :)
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39912902
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub

Соответственно к сущности Invoice нужно добавлять свойство IdentityUser из пространства Microsoft.AspNetCore.Identity.
И мой девственно чистый от зависимостей проект Models получает вливание Microsoft.AspNetCore пакета и все предыдущее разделение слоев окажется насмарку. Как можно обыграть ситуацию, чтобы не размазывать зависимости по всему решению?
Единственный вариант, который приходит в голову, это хранить в свойствах Invoice не IdentityUser, а его Guid, но EF Core, по моему не позволяет использовать такую технику.
Спасибо

это функционал логирования, не надо никаких ссылок ни в какие классы, нужно обычное логирование, показывающее кто, что и когда делал
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39912918
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford,

Вы наверное имели в виду аудит. Логирование это для диагностики, в бизнес-логике лог не должен участвовать.
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39913103
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я делал бы без EF.
Код: c#
1.
2.
3.
4.
5.
  class InvoiceWithoutEfCore
    {
        //InvoicesProperties
        public Guid IdentityUserId { get; set; } не нужно тащить Microsoft.AspNetCore.Identity
    }



Как приходится писать с EF Core

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 class InvoiceWithEfCore
    {
        //InvoicesProperties
        public Microsoft.AspNetCore.Identity.IdentityUser User { get; set; } // вот здесь  приходится тащить   Microsoft.AspNetCore.Identity
    }

    class IdentityUser
    {
        public ICollection<InvoiceWithEfCore> Invoices { get; set; }
    }


Сейчас проект с моделями выглядит так(см рис).
Соответственно, после того, как я сконфигурирую модели с учетом правил EF Core- в зависимостям на рисунке добавится зависимость от Data проекта.
Как должны идти зависимости
Models->BL(Data)->Web
После конфигурации моделей с учетом EF Core у меня получится
Models<->BL(Data)->Web,
то есть модель будет знать о бизнес логике, что мне и хотелось бы избежать.
stenford,это нужно создать еще один проект, который будет получать ссылки из Models(оттуда возьмется сущность Invoice) и Data(оттуда возьмется IdentityUser), создать сущность логгирования/аудита и дополнительно запускать операцию логгирования после добавления новой сущности Invoice в базу?
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39913446
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub

stenford,это нужно создать еще один проект, который будет получать ссылки из Models(оттуда возьмется сущность Invoice) и Data(оттуда возьмется IdentityUser), создать сущность логгирования/аудита и дополнительно запускать операцию логгирования после добавления новой сущности Invoice в базу?

конкретная реализация логирования/аудита зависит от проекта, требований, хостинга и прочих вещей. В системе, имеющей требования к безопасности, логируются все действия пользователей, что-бы можно было воссоздать кто, что и когда делал. В случае WebAPI к примеру можно логировать все вызовы эндпоинтов с указанием юзера, времени, айпишника, параметров итд, дальше есть тулзы для анализа этих логов. Если под "распечаткой" инвойса подразумевается вызов эндпоинта WebAPI то это уже было-бы достаточно для реализации данного требования.
Если таких требований нет, а все что нужно - это администратору по клику одной кнопки выдать кто и когда распечатал какие инвойсы - то можно прикрутить свой аудит, только зачем новый проект-то? Создаешь таблицу аудита и сохраняешь в нее когда инвойс "распечатывается" из контроллера, сервиса или как там у тебя солюшн собран
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39913608
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Как я делал бы без EF.
Код: c#
1.
2.
3.
4.
5.
  class InvoiceWithoutEfCore
    {
        //InvoicesProperties
        public Guid IdentityUserId { get; set; } не нужно тащить Microsoft.AspNetCore.Identity
    }



Расскажите пожалуйста, что вас так приводит в ужас от мысли тащить Microsoft.AspNetCore.Identity?
У него зависимостей нет.
Вы его используете в модели данных.

В чём проблема?

Начитаются каких-то статей от душевно больных людей, потом начитают бороться, то с IQueryable, то с зависимостями, которые как раз нужны.

Не тем занимаетесь.
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39914082
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не зашкварно так делать, то ладно.
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39915113
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Если не зашкварно так делать, то ладно.

все ты правильно писал - не надо тащить Identity в бизнес слой, ему там совершенно не место и при переходе на новую версию тебе придется редеплоить сборки с бизнес слоем, за такие вещи даже джуниоры по ушам получают на код ревью
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39915116
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
vb_sub
Если не зашкварно так делать, то ладно.

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


Фигню говорите, уж простите.

Если у человека Identity напрямую используется в модели, значит его нужно подключить и использовать.
Иначе, по вашей аналогии, все все библиотеки из нугета надо скрыть за своими абстракциями, все.

Ни одного проекта не видел, и не слышал от коллег с большим опытом, чтобы подобное сокрытие существенно помогло при "переходе на новую версию". Глупости.

Получить за подобное "по ушам" можно лишь от джуниора, но никак не от сеньора.
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39915117
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забавно, что я раньше был в таких проектах, которые ведущие разработчики вели по пути борьбы с зависимостями и втыкали абстракции куда попало. Никаких зависимостей ни от чего. В итоге проект скатывался в говно, тормозил и бажил нещадно, абстракции протекали, а джуны только и делали, что затыкали дыры.

Какой там переход "на новую версию"? Что за задача такая первостепенная, обязательно обеспечить переход на "новую версию", переход на другую базу, на другой ОРМ, на другую платформу, на другой язык. Откуда эти чудовищные идеи вообще приходят?
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39915138
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Фигню говорите, уж простите.

Если у человека Identity напрямую используется в модели, значит его нужно подключить и использовать.
Иначе, по вашей аналогии, все все библиотеки из нугета надо скрыть за своими абстракциями, все.

IdentityUser к бизнес логике не имеет никакого отношения, это идентификация и авторизация юзера вызывающего эндпоинт, а вопрос заданный топикстартером - это классическое логирование/аудит и решается как я уже написал сверху, сборка с доменными классами тут вообще не затрагивается, и уже тем более в нее не пихаются зависимости принадлежащие авторизационному слою web api. За класс инвойса, содержащий клеймы пользователей можно далеко не только по ушам получить

hVostt

Какой там переход "на новую версию"? Что за задача такая первостепенная, обязательно обеспечить переход на "новую версию", переход на другую базу, на другой ОРМ, на другую платформу, на другой язык. Откуда эти чудовищные идеи вообще приходят?

что за очередной поток сознания? Какой ОРМ? До тебя не доходит, что обновив авторизационные зависимости слоя api ты вынужден ребилдить бизнес слой?
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39915428
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
IdentityUser к бизнес логике не имеет никакого отношения, это идентификация и авторизация юзера вызывающего эндпоинт, а вопрос заданный топикстартером - это классическое логирование/аудит и решается как я уже написал сверху, сборка с доменными классами тут вообще не затрагивается, и уже тем более в нее не пихаются зависимости принадлежащие авторизационному слою web api. За класс инвойса, содержащий клеймы пользователей можно далеко не только по ушам получить


Вы не правы. Identity это конкретная реализация авторизации. Это именно реализованная бизнес-логика с конкретной моделью данных и настраиваемыми процедурами.

Если вы взяли Identity, а не пилите свою авторизацию, то используйте Identity.

Не надо фантазировать тут про инвойсы. Наличие Identity никак не влияет на любую другую логику.


stenford
что за очередной поток сознания? Какой ОРМ? До тебя не доходит, что обновив авторизационные зависимости слоя api ты вынужден ребилдить бизнес слой?


Если вы хотите правильно абстрагироваться от слоя авторизации, значит вы должны вынести её в другую БД и другой сервис. Это называется SSO. Почитайте на досуге.

А если уж вы авторизацию встроили в своё приложение и используете Identity, то никакого смысла абстрагироваться от него нет.

Это натуральная дурость.
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39915432
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот готовая реализация внешнего сервера авторизации

https://identityserver.io/

При использовании этого сервиса вам не требуется тащить никакое Identity в своё приложение и свою модель данных.
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39915722
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Вы не правы. Identity это конкретная реализация авторизации. Это именно реализованная бизнес-логика с конкретной моделью данных и настраиваемыми процедурами.

Если вы взяли Identity, а не пилите свою авторизацию, то используйте Identity.

это конкретная реализация авторизации , а не бизнес логики, IdentityUser - это авторизация "из коробки" от майкрософт основанная на куках, запихнув детали этой реализации в бизнес логику ты намертво привязываешь систему к этой конкретной реализации, и как только этот механизм потребуется сменить к примеру на токены (на чем собственно сейчас работают большинство систем ) - внезапно вся бизнес логика отправляется на переделку, последующее тестирование и редеплоймент

hVostt

Не надо фантазировать тут про инвойсы. Наличие Identity никак не влияет на любую другую логику.

Вот к чему приводит твое полное непонимание ООП - клеймы пользователей в инвойсе это нарушение первой-же буквы в слове solid, тут даже уже не джуны, а студенты-практиканты таких ошибок не допускают

hVostt

Если вы хотите правильно абстрагироваться от слоя авторизации, значит вы должны вынести её в другую БД и другой сервис. Это называется SSO. Почитайте на досуге.

А если уж вы авторизацию встроили в своё приложение и используете Identity, то никакого смысла абстрагироваться от него нет.

Вот готовая реализация внешнего сервера авторизации

https://identityserver.io/

очередная каша из терминов и подходов, которые ты не понимаешь и даже не пытаешся разобраться. Для начала, что-бы уйти от майкрософтовского Identity не обязательно использовать внешний сервер авторизации - ничто не мешает генерировать токены в своем собственно сервисе. Более того, ничто не мешает написать свой собственный велосипед на куках (без Identity), все это - детали реализации авторизационного слоя никак не связанные с работой остальной системы. Можно использовать куки, можно токены собственного производства, или сгенерированные identityserver, или от OAuth, Okta, Azure B2B или многих других - все это инкапсулировано в авторизационном слое и не имеет никакого отношения к остальной системе.
А SSO это вообще из другой оперы - эта технология позволяет получать токены без ввода пароля на сервере авторизации, просто на основе наличия авторизации от другой системы, к примеру залогинившись в gmail ты получаешь доступ к youtube т.к. последний автоматически выдаст тебе токен на основе авторизационной куки (полученной в ходе авторизации на gmail), с "абстракцией от слоя авторизации" это никак не связано, как и с обсуждаемой тут проблемой
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39915811
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
это конкретная реализация авторизации , а не бизнес логики, IdentityUser - это авторизация "из коробки" от майкрософт основанная на куках, запихнув детали этой реализации в бизнес логику ты намертво привязываешь систему к этой конкретной реализации, и как только этот механизм потребуется сменить к примеру на токены (на чем собственно сейчас работают большинство систем ) - внезапно вся бизнес логика отправляется на переделку, последующее тестирование и редеплоймент


С какой это кстати Identity привязана к кукам?
Чего вы вообще тут городите. Перестаньте позориться.

https://docs.microsoft.com/ru-ru/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-3.1


stenford
Вот к чему приводит твое полное непонимание ООП - клеймы пользователей в инвойсе это нарушение первой-же буквы в слове solid, тут даже уже не джуны, а студенты-практиканты таких ошибок не допускают


Из разряда "сам пошутил -- сам посмеялся".
Вы там напились что-ли?


stenford
очередная каша из терминов и подходов, которые ты не понимаешь и даже не пытаешся разобраться. Для начала, что-бы уйти от майкрософтовского Identity не обязательно использовать внешний сервер авторизации - ничто не мешает генерировать токены в своем собственно сервисе. Более того, ничто не мешает написать свой собственный велосипед на куках (без Identity), все это - детали реализации авторизационного слоя никак не связанные с работой остальной системы. Можно использовать куки, можно токены собственного производства, или сгенерированные identityserver, или от OAuth, Okta, Azure B2B или многих других - все это инкапсулировано в авторизационном слое и не имеет никакого отношения к остальной системе.
А SSO это вообще из другой оперы - эта технология позволяет получать токены без ввода пароля на сервере авторизации, просто на основе наличия авторизации от другой системы, к примеру залогинившись в gmail ты получаешь доступ к youtube т.к. последний автоматически выдаст тебе токен на основе авторизационной куки (полученной в ходе авторизации на gmail), с "абстракцией от слоя авторизации" это никак не связано, как и с обсуждаемой тут проблемой


Как только вы предоставите пример, показывающий проблему при апгрейде версии Identity, будем предметно разговаривать.
Ваши потуги в виде "полное непонимание ООП" и "очередная каша" выглядят как попытка придать значимость вашим словам, но подобное может сработать только в детском садике. Потрудитесь привести адекватные аргументы.

Пока что не вводите людей в заблуждение.
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39915939
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Как только вы предоставите пример, показывающий проблему при апгрейде версии Identity, будем предметно разговаривать.

с тобой не имеет смысла предметно разговаривать из-за незнания тобой ООП, SOLID, и вытекающего из этого непонимания базовых принципов разработки. Если ты не понимаешь, что слой авторизации должен иметь возможность быть заменен (или обновлен) не снося при этом бизнес логику - то повторять на 10-й раз почему я не собираюсь
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39915990
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С тобой не имеет смысла предметно разговаривать, пока не разберешься, что модель юзера (фактически POCO-классы) (плюс модели ролей и т.п.) для DAL не имеют никакого прямого отношения к авторизации. Уже сама невероятная глупость
stenford
IdentityUser - это авторизация "из коробки" от майкрософт основанная на куках
сказанная тобой, говорит о том, что ты не имел дела с этой библиотекой и в принципе подробно не занимался кастомизацией авторизации в ASP NET/NET Core, и городишь что-то на уровне слухов.
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39916028
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
с тобой не имеет смысла предметно разговаривать из-за незнания тобой ООП, SOLID, и вытекающего из этого непонимания базовых принципов разработки. Если ты не понимаешь, что слой авторизации должен иметь возможность быть заменен (или обновлен) не снося при этом бизнес логику - то повторять на 10-й раз почему я не собираюсь


Да, я об этом и прошу. Не нужно писать глупости, и тем более повторять их 10 раз.

Хотелось бы конечно узнать у вас конкретные проблемы, которые видите в этом.
Ведь вы гуру ООП и SOLID. Но не судьба. Вы их нам не покажете. Это видимо секрет уровня НАТО.
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39916038
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глянул, что же так сильно задело нашего мега-гуру ООП и SOLID-a stenford

Вот полный расклад, для тех, кому интересно.

пакет Microsoft.AspNetCore.Identity действительно имеет зависимость от Microsoft.AspNetCore.Authentication.Cookies -- ну точно, это же явно говорит о том, что Identity "построена на куках"

для слоя доступа к данным DAL можно (и нужно) сослаться на пакет Microsoft.Extensions.Identity.Stores -- если Identity реально используется в проекте конечно. Никаких левых зависимостей больше нет, ни на злосчастные куки, ни привязки к Asp.Net.

мы получим ровно то, что нужно в DAL для авторизации: POCO и интерфейсы.
это итак абстракции, делать абстракции над абстракциями не нужно, это бесполезная трата времени и сил.

если в проекте используется Entity Framework, то понятное дело, нужно
1. сослаться на пакет Microsoft.AspNetCore.Identity.EntityFrameworkCore
2. DbContext приложения должен наследоваться от IdentityDbContext

ну и обращаясь к начинающим и продолжающим.
в жизни вы увидите много треша, обмазанные в 10 слоёв абстракциями проекты от "мега-гуру ООП и SOLID".
относитесь к этому скептически.
каждое действие или решение должно иметь явный смысл и понятную пользу.

руководствуясь причинами "если бы, да кабы" вместо быстрых и эффективных решений, вы только мозги себе засрёте и не продвинетесь хоть сколько-нибудь далеко.
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39916040
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
если в проекте используется Entity Framework, то понятное дело, нужно
1. сослаться на пакет Microsoft.AspNetCore.Identity.EntityFrameworkCore
2. DbContext приложения должен наследоваться от IdentityDbContext


опять таки, не обязательно. но сильно сэкономит время.

и не нужно бояться каких-то страшных изменений, которые вам всё поломают и всё "придётся переделывать".
это продукт больных фантазий.
...
Рейтинг: 0 / 0
Хранение метки пользователя, совершившего операцию
    #39916045
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

авторизация только АПИ (как в Identity) - не особо мне нравится при интенсивной работе с сложной моделью это приводит к наводнению проекта миллионами ненужных методов
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Хранение метки пользователя, совершившего операцию
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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