如果URL包含片段,为什么Url.IsLocalUrl返回false?

我正在使用Url.IsLocalUrl来检查传递给我的身份validation操作的返回URL是否是本地的。 只要URL中没有片段,它就可以正常工作。 也就是说, /t/test-team-3/tasks/lists/15返回true,但/t/test-team-3/tasks#/lists/15返回false。

这背后的原因是什么? 是否有一些模糊的安全问题可能会在片段中出现,或者我可以在检查URL是否为本地时安全地忽略该片段?

此方法在内部调用Uri.IsWellFormedUriString方法。 在包含片段的相对URL上调用此方法时,它返回false。 MS Connect上有一个错误, 由于设计原因而关闭。

在绝对URL(使用http / https等方案)上使用此方法时,该方法的行为与预期的一样。 我认为原因是Uri类不仅适用于HTTP URL。 如果未指定协议(相对URL),则使用不允许片段的通用URL解析器。

所以我想你有两种可能性:

  • 在调用方法之前剥离片段
  • 在绝对URL( http://foo.com/t/test-team-3/tasks#/lists/15 )上调用该方法,因为无论如何,如果您在相对URL上调用此方法,我们可以预期它是一个本地URL。