2012-06-16 75 views
0

当我尝试从运行在IIS Express上的Web应用程序连接到Intranet Web服务时,Web服务返回403 Forbidden。当我通过单元测试或在Cassini或我的服务器上的IIS 7.5下运行的同一站点访问时,该服务正常工作。我的直觉告诉我这是一个配置问题,但我不确定从哪里开始寻找。从IIS Express访问远程Web服务会导致403禁止

当从IIS Express上运行的站点访问该服务时,什么会导致远程Web服务返回403 Forbidden?

澄清我访问的服务不是基于SOAP的。我正在设置一个特定的网络凭证,并将其与下面的代码所示的请求一起传递。

protected XDocument Search(Uri requestUri) 
{ 
    var nc = new NetworkCredential(this.config.ServiceUserName, 
     this.config.ServicePassword); 
    var cCache = new CredentialCache(); 
    cCache.Add(requestUri, "Basic", nc); 

    var request = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
    request.Credentials = cCache; 
    request.PreAuthenticate = true; 
    request.Method = WebRequestMethods.Http.Get; 

    var response = (HttpWebResponse)request.GetResponse(); 
    return XDocument.Load(new StreamReader(response.GetResponseStream())); 
} 
+0

从哪里开始:您的cassini应用程序可能正在您的用户标识下运行。另一方面,IIS Express可能使用不同的Windows身份运行。可能是IUSR(我不知道IIS Express)。远程服务可能使用Windows身份验证 - 并且不允许匿名访问。因此,您需要在远程服务器上的IIS vdir上为IIS Express的身份(可能是machine \ IUSR,其中machine是运行IIS Express的计算机的名称)授予权限。 – Cheeso

+0

@Cheeso我应该发布代码与我的问题。我正在提供身份验证,因此我很困惑。 – ahsteele

回答

0

我没有时间深入了解为什么现在,但我可以说它与我的代理设置有关。切换到我的盒子不同的代理提供商缓解了这个问题。这个内部事务应该一直绕过代理,为什么IIS的行为与其他机制不同。抱歉,我打算将此标记为答案,并希望小通知检查您的代理设置有助于某人。对不起,这不是更具体。

0

在对Web服务的侧窗验证的情况下,你/将运行到问题的列表:

  • 作为Cheeso指出你传请求可以是简单的匿名下运行(或本地)帐户。这可能是由于没有模拟呼叫用户而运行,并且流程本身运行在错误的帐户下,或者用户被认为是匿名的,并且请求被切换到特定的本地“匿名”帐户。
  • 当您通过打开输入用户的模拟来解决上述问题时,您将遇到“NTLM一跳地狱”问题 - 传入凭据无法在其他服务器上使用(Kerberos是一种解决方案,但不太可能在大多数情况下可用例)。
  • 当您通过禁用模拟(或在流程的帐户而不是传入用户的帐户下运行代码)并使进程在域帐户(或实际上具有Web服务权限的其他帐户)下运行时修复第一个问题时,您将运行成为事实,你可能会为用户打开获取不应该访问的数据的可能性。

本质上,您需要弄清楚哪些帐户可以/应该访问Web服务并运行代码来加载该帐户下的Web服务。该帐户必须在本地登录(不能使用传入用户的身份)。

+0

我试图访问的服务正在另一台服务器上运行。我已经添加了代码来显示我如何访问它。此代码为我希望验证的用户提供NetworkCredential。我不认为模仿在提出请求时起作用(但我可能会误解你的答案中的某些内容)。 – ahsteele

+0

我的答案与您的案例无关:它假定Windows身份验证,但您的服务使用基于您的示例代码的基本身份验证。不,我不确定它为什么不起作用。 –

相关问题