WebRequest从本地主机到本地主机:为什么被拒绝?

时间:2020-03-06 14:58:55  来源:igfitidea点击:

我的应用程序在某些时候使用WebRequest从自身获取页面。

这不应该是问题。它实际上在服务器上运行良好,该服务器是具有"中等"信任的"共享"托管程序包。在本地,我使用基于中度信任的自定义安全策略,其中包括直接从默认中度信任策略复制的以下内容:

<IPermission
  class="WebPermission"
  version="1">
    <ConnectAccess>
        <URI uri="$OriginHost$"/>
    </ConnectAccess>
</IPermission>

令人反感的行位于自定义XmlRelativeUrlResolver中:

public override object GetEntity( System.Uri puriAbsolute, string psRole, System.Type pReturnType )
{
    return _baseResolver.GetEntity( puriAbsolute, psRole, pReturnType );
}

所请求的URL与请求者在同一应用程序中的localhost上。这是堆栈跟踪的顶部。

at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
   at System.Security.CodeAccessPermission.Demand()
   at System.Net.HttpWebRequest..ctor(Uri uri, ServicePoint servicePoint)
   at System.Net.HttpRequestCreator.Create(Uri Uri)
   at System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase)
   at System.Net.WebRequest.Create(Uri requestUri)
   at System.Xml.XmlDownloadManager.GetNonFileStream(Uri uri, ICredentials credentials)
   at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials)
   at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn)
   at flow.controls.XmlRelativeUrlResolver.GetEntity(Uri puriAbsolute, String psRole, Type pReturnType) in c:\flow\source\controls\DataTransform.cs:line 105
   at System.Xml.Xsl.Xslt.XsltLoader.CreateReader(Uri uri, XmlResolver xmlResolver)

有人在这里看到问题吗?

@Sijin:谢谢你的建议。发送到解析器的url基于请求URL,我在调试器中确认访问127.0.0.1的站点会产生相同的结果。

解决方案

如果我们将127.0.0.1代替localhost可以正常工作吗?

我的无知我不知道$ OriginHost $令牌是使用信任级别的originUrl属性替换的,我认为它只是来自应用程序的URL。我最初将此属性留为空白。

<trust level="CustomMedium" originUrl="http://localhost/" />

这可能不是解决方案,但是当我看到帖子时,我想起了大约一年前遇到的这个问题:

http://support.microsoft.com/default.aspx/kb/896861
  
  You receive error 401.1 when you
  browse a Web site that uses Integrated
  Authentication and is hosted on IIS
  5.1 or IIS 6

我们正在创建一个WebRequest来对屏幕上的页面进行抓屏,并且它在我们的生产环境中可以正常工作,因为我们没有使用回送主机名,但是在开发机器上,我们最终被拒绝访问(在应用Windows Server 2003 SP2之后)。这里的一个区别是,这是在集成身份验证下进行的,这导致它失败了……它在匿名请求时起作用(因此,我不确定这是否是答案)。