OAuth - упорядочение лексикографического значения байта в c # - PullRequest
1 голос
/ 08 мая 2009

Я написал реализацию Service Provider для OAuth, и один из разработчиков обнаружил ошибку в том, как реализация упорядочивала параметры запроса. Я полностью пропустил требование лексикографического порядка в спецификации OAuth и просто выполнял базовую сортировку строк для параметров значения имени

С учетом следующего URI-запроса от потребителя:

http://api.com/v1/People/Search?searchfor=fl&communication=test@test.com&Include=addresses

Полученная база сигнатур должна упорядочить параметры следующим образом:

Include=addresses, communication=test@test.com, searchfor=fl

С учетом следующего URI-запроса от потребителя:

http://api.com/v1/People/Search?searchfor=fl&communication=test@test.com&include=addresses

Полученная база сигнатур должна упорядочить параметры следующим образом:

communication=test@test.com, include=addresses, searchfor=fl

Обратите внимание на разницу в регистре в параметре строки запроса «include». Из того, что я понимаю, лексикографическое упорядочение байтовых значений упорядочит параметры, используя значение ascii, а затем упорядочит asc.

Поскольку I = 73 и i = 105, заглавная буква I должна быть заказана до строчной буквы i.

Пока у меня есть следующее:

IEnumerable<QueryParameter> queryParameters = parameters
.OrderBy(parm => parm.Key)
.ThenBy(parm => parm.Value)
.Select(
parm => new QueryParameter(parm.Key, UrlEncode(parm.Value)));

Но это не распространяется на символы ascii по сортировке символов (IncLude = test & Include = test не будет сортироваться должным образом).

Есть мысли о том, как создать эффективный алгоритм, который поможет решить эту проблему? Или как сделать регистр чувствительным с помощью ICompare?

Ответы [ 3 ]

0 голосов
/ 08 мая 2009

Ник, как вы обнаружили StringComparison. Обычный путь. Я просто хотел предупредить, что вы сортируете ПОСЛЕ того, как URI кодирует каждый из ключей и значений.

Кстати, уже есть несколько библиотек OAuth, DotNetOpenAuth - мой любимый (отказ от ответственности: по необъективным причинам) Вы уверены, что хотите построить / поддерживать этот?

0 голосов
/ 08 октября 2009

У меня была проблема с тем же выражением (хотя оно больше не написано с ошибками в документации OAuth, - если это место, где оно было написано с ошибками)

Wikipedia sais, " лексикографический порядок " имеет значение, когда указан порядок букв. Он определяет порядок последовательностей элементов (букв), когда порядок элемента уже указан.

Это звучит разумно для меня. :.)

0 голосов
/ 08 мая 2009

Я решил проблему, создав собственный компаратор, однако он кажется неуклюжим, и я считаю, что должен быть лучший способ:

public class QueryParameterComparer : IComparer<QueryParameter> {
    public int Compare(QueryParameter x, QueryParameter y) {
          if(x.Key == y.Key) {
             return string.Compare(x.Value, y.Value, StringComparison.Ordinal);
          }
           else {
             return string.Compare(x.Key, y.Key, StringComparison.Ordinal);
          }
    }
} 

Использование сравнения строк в Ординале - вот что сделало это для меня. Он выполняет байтовые сравнения, и это именно то, что мне нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...