【问题标题】:Callback URL matching logic回调 URL 匹配逻辑
【发布时间】:2013-08-23 17:48:50
【问题描述】:

我正在开发 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));
    }
}

提前致谢。

问候, 苏约格

【问题讨论】:

    标签: c# .net http url uri


    【解决方案1】:

    你应该看看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

    【讨论】:

    • Uri.Compare 将匹配确切的 Url。例如如果 url 完全匹配,它将返回 0。我不想要这个。我想要的是foo.com/a/b 如果我将它与foo.com/a 进行比较,则应该返回一个匹配项,反之亦然
    • 它需要 UriComponents 按位枚举来定义要比较的 uri 的哪些组件:msdn.microsoft.com/en-us/library/7767559y.aspx
    • 因此您使用 Uri.Compare 然后进行后续路径比较。我会更新的。
    • 你的逻辑是有道理的。另外,我还需要做些什么来获得 url 匹配吗?
    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2018-04-11
    • 2021-12-26
    • 2014-07-24
    相关资源
    最近更新 更多