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

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

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

Я использую 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
            };
    }
}

person Hoang Tran    schedule 31.10.2017    source источник


Ответы (2)


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

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

Я поместил свой код в блок using, но все API успешно запустились

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

person aaron    schedule 14.11.2017

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

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

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

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

person Alper Ebicoglu    schedule 01.11.2017
comment
Мой проект - MVC в asp.net 4.6.1. Могу ли я использовать токен на предъявителя? - person Hoang Tran; 01.11.2017
comment
Для MVC вы не можете использовать токен носителя. Вам необходимо выполнить аутентификацию файлов cookie. После того, как вы сделаете запрос на вход. Вы получите ответные файлы cookie. Что вам нужно сделать, так это; добавьте эти файлы cookie в свои запросы. Если я правильно помню, файлы cookie должны быть ASP.NET_SessionId .AspNet.ApplicationCookie. - person Alper Ebicoglu; 01.11.2017
comment
Решение — это не пара строк кода. Поэтому я не могу предоставить вам полное кодовое решение. - person Alper Ebicoglu; 01.11.2017
comment
Спасибо, а как получить куки без авторизации пользователя? Мне нужно запустить рабочий процесс как запланированное задание. - person Hoang Tran; 01.11.2017
comment
Я думаю, что вы на неправильном пути. Вы не можете аутентифицировать пользователей без учетных данных. Почему бы вам просто не игнорировать аутентификацию! Простое решение; сделать службы анонимной аутентификации. Добавьте токен безопасности, который вы можете расшифровать и проверить, чтобы продолжить. Не выполняйте аутентификацию, просто отправьте токен, идентификатор пользователя и другие параметры методу службы приложения. - person Alper Ebicoglu; 01.11.2017
comment
рассмотрит ваше решение, есть ли способ создать учетные данные напрямую? Я позвоню этим API в том же приложении. - person Hoang Tran; 01.11.2017