Я не уверен, придумал ли я термин, приведенный выше в заголовке, но ниже - мое резюме проблемы.Авторизация с идентификатором ASP.NET
Я разработал API REST с использованием ASP.NET WebAPI с идентификацией для аутентификации.
Для примера. например, у меня есть API компании, лежащий на http://<myurl>/api/Companies
для GET и POST и http://<myurl>/api/Companies/{id}
для GETBYID, PUT и DELETE.
При тестировании API я обнаружил, что после аутентификации пользователя (по токенам) он/она может редактировать любую компанию.
Я бы хотел ограничить пользователей редактированием/удалением компаний (и других объектов), к которым он принадлежит (в соответствии с логической структурой таблицы).
Solution On My Mind: Первая мысль приходит на ум использует ApplicationUser user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
, чтобы найти пользователь, который запрашивающую операцию, а затем найти компанию он/принадлежит сказать по user.CompanyID
и матчу с, если s Полезной Нагрузки/он пытается отредактировать/удалить или выполнить некоторую другую операцию на том же объекте, к которому он принадлежит.
Да, для разных лиц это будет user.EntityID
. Но правильно ли это сделать?
Потому что таким образом, я должен написать этот код на всех моих контроллерах Edit and Delete operation.
Я знаю, ASP.NET не может ограничивать вещи в логической структуре. Например, здесь, в моем случае, он не может определить, пытается ли пользователь отредактировать компанию, к которой он принадлежит или нет, поскольку это что-то логичное для отношения к БД. Но есть ли что-то вроде атрибута [Authorize]
, который я могу разработать, который будет содержать вышеуказанную логику, а не загромождать контроллер?
ОБНОВЛЕНИЕ: Не уверен, что все понимают ситуацию, но вот еще одна история, поясняющая. Это приложение SaaS в облаке с базой данных Multi-Tenant. Таким образом, у каждой Компании есть свой набор Пользователей и других Субъектов, которые не могут иметь доступ к Объектам за пределами своей Компании (в соответствии с табличным отношением).
API-интерфейсы обрабатываются Front-End WebApp, поэтому Ограничение по показам что я делаю сейчас. Но меня беспокоит, что, если кто-то просто проверяет JS-файл и вызывает API напрямую?
Мне нужно что-то, чтобы ограничить пользователя только его сущностями.
Это потребует от системы расширения системы identity/auth до уровня базы данных, что может считаться плохим дизайном. – Dai
Кроме того, во многих системах баз данных (таких как те, которые не могут интегрироваться со службой Directory, например Neo4j) это не является возможным решением, а интеграция с предприятиями сложна во многих базах данных - и это невозможно в общедоступные сценарии веб-приложений. – Dai
Это на самом деле то, как Microsoft самостоятельно защитила безопасность для [Microsoft Dynamics CRM] (https://technet.microsoft.com/en-us/library/dn531182.aspx). Хотя это может быть более масштабное мероприятие, я сомневаюсь, что многие согласятся с тем, что блокирование базы данных на уровне базы данных является «плохим дизайном». Напротив, он защищен от лазеек безопасности. – cchamberlain