Рекомендации по защите REST API / веб-службы [закрыто]

Вы правы в TaskCompletionSource, это ключ к преобразованию EAP (асинхронный шаблон на основе событий) в задачу TPL.

Это описано здесь: https://docs.microsoft. com / en-us / dotnet / standard / parallel-programming / tpl-and-traditional-async-programming # разоблачение-complex-eap-operations-as-tasks

Вот упрощенная code:

public static class Extensions  
{
    public static Task GetRssDownloadTask(
        this WebClient client, Uri rssFeedUri)
    {
        // task completion source is an object, which has some state.
        // it gives out the task, which completes, when state turns "completed"
        // or else it could be canceled or throw an exception
        var tcs = new TaskCompletionSource(); 

        // now we subscribe to completed event. depending on event result
        // we set TaskCompletionSource state completed, canceled, or error
        client.DownloadStringCompleted += (sender, e) => 
        {
                  if(e.Cancelled) 
                  {
                      tcs.SetCanceled();
                  }
                  else if(null != e.Error)
                  {
                      tcs.SetException(e.Error);
                  }
                  else
                  { 
                      tcs.SetResult(XDocument.Parse(e.Result));
                  }
        };

        // now we start asyncronous operation
        client.DownloadStringAsync(rssFeedUri);
        // and return the underlying task immediately
        return tcs.Task;
    }
}

Теперь все, что вам нужно сделать, чтобы сделать цепочку этих операций, - это просто установить ваши продолжения (что на данный момент не очень удобно, а C # 5 ждет и async сильно поможет с этим)

Итак, этот код можно использовать следующим образом:

public static void Main()
{
    var client = new WebClient();

    client.GetRssDownloadTask(
        new Uri("http://blogs.msdn.com/b/ericlippert/rss.aspx"))
        .ContinueWith( t => {
            ShowXmlInMyUI(t.Result); // show first result somewhere
            // start a new task here if you want a chain sequence
        });

    // or start it here if you want to get some rss feeds simultaneously

    // if we had await now, we would add 
    // async keyword to Main method defenition and then

    XDocument feedEric = await client.GetRssDownloadTask(
        new Uri("http://blogs.msdn.com/b/ericlippert/rss.aspx"));
    XDocument feedJon = await client.GetRssDownloadTask(
        new Uri("http://feeds.feedburner.com/JonSkeetCodingBlog?format=xml"));
    // it's chaining - one task starts executing after 
    // another, but it is still asynchronous
}

816
задан Jakub Kubrynski 14 July 2014 в 22:18
поделиться

7 ответов

Как tweakt сказал, Amazon S3 является хорошей моделью для работы с. Их подписи запроса действительно имеют некоторые функции (такие как слияние метки времени), что справка принимает меры и против случайного и злонамеренного воспроизведения запроса.

хорошая вещь об Основном HTTP состоит в том, что фактически все библиотеки HTTP поддерживают его. Необходимо будет, конечно, потребовать SSL в этом случае, потому что отправка незашифрованных паролей по сети является почти универсально плохой вещью. Основной предпочтительно для Обзора при использовании SSL, потому что, даже если вызывающая сторона уже знает, что учетные данные требуются, Обзор требует, чтобы дополнительное распространение в прямом и обратном направлениях обменивалось значением данного случая. С Основным вызывающие стороны просто отправляют учетным данным первый раз.

, Как только идентификационные данные клиента устанавливаются, авторизация является действительно просто проблемой реализации. Однако Вы могли делегировать авторизацию к некоторому другому компоненту с существующей моделью авторизации. Снова хорошей вещью об Основном здесь является Ваш сервер, заканчивается с копией простого текста пароля клиента, который можно просто передать другому компоненту в инфраструктуре по мере необходимости.

293
ответ дан Greg Hewgill 14 July 2014 в 22:18
поделиться

Одно из лучших сообщений, с которыми я когда-либо сталкивался относительно безопасности, поскольку это касается REST, закончено в 1 RainDrop. Использование API MySpace OAuth также для безопасности и у Вас есть полный доступ к их пользовательским каналам в коде RestChess, с которым я сделал большое исследование. Это было demo'd в Mix, и можно найти регистрацию здесь .

17
ответ дан degnome 14 July 2014 в 22:18
поделиться

Можно также хотеть смотреть на OAuth, появляющийся открытый протокол для основанной на маркере авторизации, конкретно предназначающейся http пчела.

Это очень похоже на подход, проявленный , flickr и помнит молоко пчела "отдыха" (не обязательно хорошие примеры успокоительной пчелы, но хорошие примеры основанного на маркере подхода).

72
ответ дан John Spurlock 14 July 2014 в 22:18
поделиться

Нет никаких стандартов для REST кроме HTTP. Там существуют установленные сервисы REST. Я предлагаю, чтобы Вы посмотрели на них и получили ощущение того, как они работают.

, Например, мы одолжили много идей от услуг S3 REST Amazon при разработке нашего собственного. Но мы решили не использовать больше повышенной безопасности, основанной на модели на подписях запроса. Более простым подходом является HTTP Основной автор по SSL. Необходимо решить что работы лучше всего в ситуации.

кроме того, я настоятельно рекомендую книге УСПОКОИТЕЛЬНЫЕ веб-сервисы от O'reilly. Это объясняет базовые понятия и действительно обеспечивает некоторые лучшие практики. Можно обычно брать модель, которую они обеспечивают и отображают его на собственное приложение.

114
ответ дан Macke 14 July 2014 в 22:18
поделиться

Спасибо за превосходный совет. Мы закончили тем, что использовали пользовательский HTTP-заголовок для передачи маркера идентификационных данных от клиента в службу, при подготовке к интеграции нашего УСПОКОИТЕЛЬНОГО API с предстоящая платформа Идентификационных данных Церматта из Microsoft. Я описал проблему здесь и наше решение здесь . Я также взял совет tweakt и купил УСПОКОИТЕЛЬНЫЕ веб-сервисы - очень хорошая книга, если Вы создаете УСПОКОИТЕЛЬНЫЙ API какого-либо вида.

15
ответ дан Community 14 July 2014 в 22:18
поделиться

Я использовал OAuth несколько раз, и также использовал некоторые другие методы (ОСНОВНОЙ / ОБЗОР). Я искренне предлагаю OAuth. Следующая ссылка является лучшим учебным руководством, которое я видел при использовании OAuth:

http://hueniverse.com/oauth/guide/

25
ответ дан Derek Lee 14 July 2014 в 22:18
поделиться
  • 1
    Сделайте это:) Нет никакого неправильного способа сделать что-то вроде этого... – pearcoding 17 May 2012 в 16:06

Я немного удивлен, что SSL с клиентскими сертификатами еще не упоминается. Конечно, этот подход действительно полезен, только если вы можете рассчитывать на то, что сообщество пользователей будет идентифицировано сертификатами. Но ряд правительств / компаний выдают их своим пользователям. Пользователю не нужно беспокоиться о создании еще одной комбинации имени пользователя и пароля, а личность устанавливается для каждого соединения, поэтому связь с сервером может быть полностью без сохранения состояния, никаких пользовательских сеансов не требуется. (Не означает, что для любых / всех других упомянутых решений требуются сеансы)

43
ответ дан 22 November 2019 в 21:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: