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