c# - 回调URL匹配逻辑

标签 c# .net http url uri

我正在开发一个 OAuth 类型的模块。在此我有一组 URL,称为白名单 URL。我必须检查指定的回调 URL 是否与集合中的任何这些 URL 匹配。

我编写了以下代码。请让我知道我是否做对了,或者我是否遗漏了一些步骤。另外,如果我想对这些方法进行单元测试,请告诉我是否需要任何类型的重构。

代码是:

public class ValidateURLs
{
    public bool MatchRedirectUrl(string requestUrl, IList<string> urlCollection)
    {
        var requestUri = new Uri(requestUrl);
        foreach (var url in urlCollection)
        {
            var matchUri = new Uri(url);
            if (IsDomainMatching(requestUri, matchUri))
            {
                if (IsPortMatch(requestUri, matchUri))
                {
                    if (IsPathMatch(requestUri, matchUri))
                        return true;
                    else
                        return false;
                }
            }
        }

        return false;
    }

    private bool IsDomainMatching(Uri url1, Uri url2)
    {
        var result = String.Compare(url1.Host, url2.Host);
        if (result == 0)
            return true;
        else
            return false;
    }

    private bool IsPortMatch(Uri url1, Uri url2)
    {
        if (url1.Port == url2.Port)
            return true;

        return false;
    }

    private bool IsPathMatch(Uri url1, Uri url2)
    {
        return (url1.PathAndQuery.StartsWith(url2.PathAndQuery) || url2.PathAndQuery.StartsWith(url1.PathAndQuery));
    }
}

提前致谢。

问候, 苏约格

最佳答案

与其编写所有这些代码,不如看看 Uri.Compare

但是您还希望 path.startswith 成为比较的一部分。请注意,它需要一个按位枚举 UriComponents 来定义要比较的 url 的哪些组件。因此,您可以将大部分代码替换为 Uri.Compare,而不是比较路径,然后使用 startsWith 路径 ANDed。

所以你所有的代码都可以替换成类似的东西:

 Uri.Compare(uri1, uri2, UriComponents.HostAndPort, ...) == 0 &&
 (url1.PathAndQueryStartsWith(url2.PathAndQuery) || url.PathAndQueryStartsWith(...));

旁注,代码为这种形式:

    var result = String.Compare(url1.Host, url2.Host);
    if (result == 0)
        return true;
    else
        return false;

可以简单地写成:

return String.Compare(url1.Host, url2.Host) == 0;

你也应该做不区分大小写的比较:StringComparison.OrdinalIgnoreCase

关于c# - 回调URL匹配逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18356024/

相关文章:

c# - 为什么我的数据透视表字段名称被视为无效和/或我的数据被视为未组织为带有标签列的列表?

c# - 堆叠条形图

c# - 无法使用 MRTK v2.0.0-RC1 进行构建

c# - 从 Gridview 中的某些行隐藏图像按钮

.net - TinyIoC:在单个实例上注册多个接口(interface)

.net - 使用 WPF 双向数据绑定(bind)时更改 setter 属性中的值

xml - 无法使用 IE8 查看 XML 文件的源代码

c# - 在 C# 的 Excel [2007] 中添加超链接 - 在 Excel 中它自己

http - Jmeter如何获取路径中的动态参数值

javascript - express 无法从 url 获取查询参数