C# 回调URL匹配逻辑

C# 回调URL匹配逻辑,c#,.net,http,url,uri,C#,.net,Http,Url,Uri,我正在开发OAuth类型的模块。在这里,我有一个URL集合,称为白名单URL。我必须检查指定的回调URL是否与集合中的任何URL匹配 我已经编写了以下代码。请让我知道我做得是否正确,或者我是否遗漏了一些步骤。另外,如果我想对这些方法进行单元测试,请告诉我是否需要重构 代码是: public class ValidateURLs { public bool MatchRedirectUrl(string requestUrl, IList<string> urlCollecti

我正在开发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));
    }
}
公共类ValidateURLs
{
public bool MatchRedirectUrl(字符串requestUrl,IList urlCollection)
{
var requestUri=新的Uri(requestUrl);
foreach(urlCollection中的变量url)
{
var matchUri=新Uri(url);
if(IsDomainMatching(请求URI,匹配URI))
{
if(IsPortMatch(requestUri,matchUri))
{
if(IsPathMatch(requestUri,matchUri))
返回true;
其他的
返回false;
}
}
}
返回false;
}
私有布尔值IsDomainMatching(Uri url1,Uri url2)
{
var result=String.Compare(url1.Host,url2.Host);
如果(结果==0)
返回true;
其他的
返回false;
}
私有bool-IsPortMatch(Uri url1,Uri url2)
{
if(url1.Port==url2.Port)
返回true;
返回false;
}
私有bool-IsPathMatch(Uri url1、Uri url2)
{
return(url1.PathAndQuery.StartsWith(url2.PathAndQuery)| | url2.PathAndQuery.StartsWith(url1.PathAndQuery));
}
}
提前谢谢

问候,,
Suyog

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

但您也希望path.startswith成为比较的一部分。请注意,需要按位枚举UriComponents来定义要比较的url组件。因此,您可以用Uri替换大部分代码。比较不比较路径,然后有一个startsWith path and

因此,您的所有代码都可以替换为以下内容:

 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。我不要这个。我想要的是,如果我将其与进行比较,则应该返回一个匹配项,反之亦然,需要UriComponents按位枚举来定义要比较的uri的哪些组件:因此使用uri.compare,然后使用后续的路径比较。我会更新的。你的逻辑是有道理的。还有,我还需要做什么来获得url匹配?