OAuth - c#中的词典字节值排序

时间:2009-05-08 11:38:25

标签: sorting oauth parameters

我为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使排序区分大小写?

3 个答案:

答案 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”具有意义,当给出字母排序时。它指定了元素的顺序已经指定时的一系列元素(字母)的排序。

这对我来说听起来很合理。 :)