我正在开发一个 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/