Изменение. NET Основные роли в зависимости от того, к какой организации пользователь запрашивает доступ (по запросу) - PullRequest
3 голосов
/ 29 января 2020

У меня есть сценарий использования, когда пользователь нашего. NET Базового API может принадлежать нескольким «организациям» и иметь разные роли в этих организациях.

Например, если они отправляют в местоположение / Создайте конечную точку от имени OrganizationId = 1, они должны иметь права администратора. Однако, если они пытаются получить доступ к этой конечной точке от имени OrganizationId = 2, они должны иметь только базовые c пользовательские привилегии. Пользователь может выполнять эти действия без выхода из системы и повторного входа в систему.

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

Мне не удалось найти пример случая, когда промежуточное ПО изменяет роль пользователей до того, как конвейер запросов достигает действия контроллера, при каждом запросе. У кого-нибудь есть опыт работы с подобной схемой аутентификации?

1 Ответ

2 голосов
/ 29 января 2020

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

Например, Джон Смит принадлежит двум организациям с ID 1 и 2. Модель разрешений пользователей может выглядит примерно так:

UserPermissionLevel
------------------------------------------------
| Uid | Name         | OrganizationId | RoleId |
|----------------------------------------------|
| 1   | John Smith   | 1              | 1      |
| 1   | John Smith   | 2              | 2      |
| 2   | Jane Doe     | 2              | 1      |
------------------------------------------------

И у вас будет отдельная таблица, содержащая разрешения Role, например:

Role
-------------------------------------
| RoleId | Name  | CanGet | CanPost |
|-----------------------------------|
| 1      | Admin | True   | True    |
| 2      | Basic | True   | False   |
-------------------------------------

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

public class OrgAuthorizationMiddleware
{
    ...

    public async Task Invoke(HttpContext context, MyDbContext databaseContext)
    {
        // Check that the user has the requested role and the
        // appropriate permission for the request as needed.
        // Add additional request type logic to check user's
        // specific permissions from UserPermissionLevel.
        if databaseContext.Role.Any(x => x.RoleId, RoleId)
        {
            await _next.Invoke(context);
        }
        else
        {
            context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...