Как создать аутентификацию и авторизацию на основе идентификатора пользователя

Я новичок в ASP.NET MVC5. Я попытался создать приложение для бронирования с пользователями и администратором. Пользователь может регистрироваться и бронировать товары, отображать свою информацию о бронировании, используя свой собственный профиль (после входа в систему).

Я хочу, чтобы Пользователи могли войти в свой профиль и создать/прочитать свое собственное бронирование. Они должны быть авторизованы только в своем профиле после входа в систему. Администратор должен иметь доступ ко всему контроллеру.

Я попытался найти учебник по этому вопросу, но я могу ограничить доступ к контроллеру только на основе роли (например, администратора), но не для конкретного пользователя с его собственным идентификатором (например, пользователь 1 может получить доступ только к информации о пользователе 1).

Я ценю любой ответ. Большое Вам спасибо.


person StudyProgramming    schedule 07.04.2018    source источник
comment
Я думаю, что User1, имеющий доступ только к информации User1, будет частью бизнес-логики в действии контроллера, потому что, пока вы не запросите базу данных, вы не знаете, связан ли запрашиваемый элемент с User1 или нет. Таким образом, вам придется запросить его, а затем вернуть ответ «Запрещено», если он окажется на элементе, к которому у них нет доступа. В равной степени, если ваше действие просто извлекает профиль пользователя, то когда действие выполняется, вы знаете, кто этот пользователь, поэтому вы всегда можете просто вернуть ему его собственный профиль, должно быть невозможно когда-либо получить профиль другого пользователя.   -  person ADyson    schedule 07.04.2018
comment
Большое тебе спасибо! У меня возникла идея реализовать логику внутри контроллера. Но я понятия не имел, как это правильно реализовать. Например, у меня есть контроллер бронирования Index (int Id), который может получать идентификатор пользователя, чтобы перенаправить его на собственное бронирование. Пользователь — это одна роль, поэтому, если один пользователь вошел в систему, он все равно может изменить URL-адрес на идентификатор другого пользователя, чтобы проверить бронирование других. Я хочу ограничить это.   -  person StudyProgramming    schedule 08.04.2018
comment
Итак, в этом сценарии вам все равно нужно выполнить метод действия. Но предположительно, когда вы запрашиваете базу данных, в этот момент вы можете узнать, действительно ли у пользователя есть разрешение на это бронирование или нет. Если они этого не сделают, вы можете вернуть сообщение об ошибке вместо информации о бронировании.   -  person ADyson    schedule 08.04.2018
comment
Как реализовать проверку разрешений? Я думаю сохранить идентификатор в ViewBag, чтобы проверить его на соответствие запрошенному идентификатору, но, возможно, это плохая практика. Я хотел бы получить некоторую идею от вас, добрый сэр. знак равно   -  person StudyProgramming    schedule 08.04.2018
comment
Я не думаю, что viewbag здесь уместен. В самом простом сценарии ваша таблица Bookings в базе данных должна иметь столбец, содержащий идентификатор пользователя, у которого есть разрешение на это бронирование. Запрошенный идентификатор бронирования приходит к вам в параметрах метода действия. Вы читаете эту строку из базы данных, первичным ключом которой является идентификатор бронирования, а затем проверяете, соответствует ли связанный идентификатор пользователя идентификатору текущего пользователя, вошедшего в систему. Если это так, то покажите детали бронирования. Если нет, то показать ошибку.   -  person ADyson    schedule 09.04.2018


Ответы (1)


Это мультиарендное приложение, поэтому вам следует немного прочитать о мультитенантности. Кроме того, это довольно хорошо работает с авторизацией требований, так что вам тоже следует это прочитать.

Вы можете создать простую модель разрешений с 3 разрешениями (чтение, создание, редактирование). У каждого пользователя есть одно или несколько требований к ресурсам (ресурсом может быть URL-адрес его профиля или идентификатор пользователя в базе данных). Каждое требование ресурса может иметь одно или несколько разрешений для операций, которые пользователь может выполнять с этим ресурсом.

Таким образом, вы можете предоставить своим пользователям полные права доступа (R,C,E) к записям его собственного профиля. Кроме того, пользователь может дать некоторые разрешения другим пользователям (например, он может дать права на чтение всем или права на редактирование своим друзьям). Это делает пользователя «администратором» его собственного профиля, и он может давать некоторые ограниченные разрешения другим пользователям.

Вы можете сгруппировать разрешения в роли, поэтому, когда вы даете пользователю роль, все разрешения (и утверждения) создаются для него автоматически.

Для действий контроллера вы можете искать ClaimsAuthorizeAttribute (на SO есть несколько, например этот: authorize-attribute">MVC5 утверждает версию атрибута Authorize). Кроме того, здесь есть отличная библиотека с множеством помощников в проектах IdentityServer: https://github.com/IdentityServer

person Community    schedule 08.04.2018