我为OAuth编写了一个服务提供程序实现,其中一个Devs发现了实现命令查询参数的方式中的错误。我完全错过了OAuth规范中的lexicographical ordering要求,只是对名称值参数进行了基本的字符串排序
给出来自消费者的以下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之前订购资本。
到目前为止,我有以下内容:
IEnumerable<QueryParameter> queryParameters = parameters
.OrderBy(parm => parm.Key)
.ThenBy(parm => parm.Value)
.Select(
parm => new QueryParameter(parm.Key, UrlEncode(parm.Value)));
但是这不会涵盖按字符排序的ascii字符(IncLude = test&amp; Include = test将无法正确排序)。
有关如何制作能够解决此问题的高效算法的任何想法?或者如何通过ICompare使排序区分大小写?
答案 0 :(得分:0)
我通过创建自定义比较器解决了这个问题,然而,它似乎很笨重,我觉得必须有更好的方法:
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);
}
}
}
使用Ordinal字符串比较对我来说是什么。它进行字节比较,这正是我所需要的。
答案 1 :(得分:0)
尼克,你已经发现了StringComparison.Ordinal是要走的路。我只想提出一个警告,在对URI编码每个键和值之后进行排序。
顺便说一下,已经有一些OAuth库,DotNetOpenAuth是我最喜欢的(免责声明:出于偏见的原因)。你确定要建立/维护这个吗?答案 2 :(得分:0)
我遇到了同一个表达式的问题(虽然它在OAuth文档中不再拼写错误, - 如果那是拼写错误的地方。)
Wikipedia sais,“lexicographical ordering”具有意义,当给出字母排序时。它指定了元素的顺序已经指定时的一系列元素(字母)的排序。
这对我来说听起来很合理。 :)