Я написал реализацию 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?