2

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

4

3 回答 3

0

尼克,你已经发现 StringComparison.Ordinal 是要走的路。我只是想提醒您在对每个键和值进行 URI 编码后进行排序。

顺便说一句,已经有一些 OAuth 库,DotNetOpenAuth是我最喜欢的(免责声明:出于偏见的原因)。您确定要构建/维护这个吗?

于 2009-05-08T18:57:05.490 回答
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);
          }
    }
} 

使用序数字符串比较对我来说是什么。它进行字节比较,这正是我所需要的。

于 2009-05-08T12:34:10.140 回答
0

我对相同的表达式有问题(尽管它在 OAuth 文档中不再拼写错误,如果那是拼写错误的地方。)

Wikipedia sais,“字典顺序”在给出字母顺序时有意义。当元素的顺序已经指定时,它指定一系列元素(字母)的顺序。

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

于 2009-10-08T19:33:28.497 回答