Как вызвать веб-API под определенным пользователем разрешением?

У меня есть функция, которая позволяет конечному пользователю выполнить Workflow (содержит много API) или запланировать его запуск в качестве фонового задания.

Пример: User1 создает Workflow1, который содержит 3 API (Api1, Api2, Api3) и настраивает его на работу в 9 утра каждый день.

я использую HttpClient называть каждый API следующим образом:

var client = new HttpClient { BaseAddress = new Uri("http://localhost/") };
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = client.PostAsJsonAsync("/api/services/myApp/workflow/Api1?input=something", "").Result;

Как мне добавить учетные данные User1 на запрос, пока пользователь не вошел в приложение (потому что оно будет автоматически запускаться как запланированное задание)?

Обновление 1

Я решил использовать рефлексию для вызова API по имени строки.

В случае непосредственного выполнения API, как запустить его с определенным разрешением?

Обновление 2

Я положил свой код внутри using блок, но все API были запущены успешно:

using (_session.Use(1, 3)) // 3 is the Id of User1, who has no permissions
{
    // Execute operator
    switch (input.Operator.Type)
    {
        case "api":
            executeApiResult = await ExecuteApi(input);
            break;
        case "procedure":
            executeApiResult = await ExecuteProcedure(input);
            break;
        default:
            return new ExecuteOperatorOutput
            {
                Result = new ExecuteOperatorResult { Status = false, Message = $"Wrong operator type: {input.Operator.Type}" },
                WorkflowStatus = false
            };
    }
}

2 ответа

Решение

В случае непосредственного выполнения API, как запустить его с определенным разрешением?

Вы можете переопределить текущие значения сеанса и вызвать свой метод внутри using блок.

Я положил свой код внутри using блок, но все API были успешно запущены

Объявите ваши методы API как public virtual поскольку есть некоторые ограничения для AbpAuthorize,

У вас есть два варианта.

1- Вы можете сделать эти Сервисы приложений анонимно доступными. И если вы хотите, чтобы он был безопасным, отправьте зашифрованный маркер безопасности.

2- Вы не упомянули, является ли ваш проект MVC или Angular. Я предполагаю, что у вас есть угловая версия Вам нужен токен на предъявителя для выполнения аутентифицированных запросов. Сначала вы должны аутентифицировать пользователя и получить токен. Затем добавьте этот токен на каждый запрос.

Вы должны исследовать использование токенов на предъявителя в ядре asp.net...

Другие вопросы по тегам