C# 从IIS Express访问远程web服务将导致403被禁止

C# 从IIS Express访问远程web服务将导致403被禁止,c#,iis-express,http-status-code-403,cassini,C#,Iis Express,Http Status Code 403,Cassini,当我试图从运行在该web服务上的web应用程序连接到intranet web服务时,该web服务返回一个错误消息。当我通过单元测试或从运行在我的服务器上或IIS 7.5下的同一站点进行访问时,该服务可以正常工作。我的直觉告诉我这是一个配置问题,但我不确定从哪里开始寻找 当从运行在IIS Express上的站点访问远程web服务时,什么会导致该服务返回403禁止 为了澄清我正在访问的服务不是基于SOAP的。我正在设置一个特定的网络凭据,并将其与我的请求一起传递,下面的代码对此进行了说明 prote

当我试图从运行在该web服务上的web应用程序连接到intranet web服务时,该web服务返回一个错误消息。当我通过单元测试或从运行在我的服务器上或IIS 7.5下的同一站点进行访问时,该服务可以正常工作。我的直觉告诉我这是一个配置问题,但我不确定从哪里开始寻找

当从运行在IIS Express上的站点访问远程web服务时,什么会导致该服务返回403禁止

为了澄清我正在访问的服务不是基于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()));
}

在Web服务端使用Windows Auth时,您正在/将要遇到的问题列表:

  • 正如Cheeso所指出的,您的请求可能只是在匿名(或本地)帐户下运行。这可能是由于运行时没有模拟调用用户,进程本身在错误的帐户下运行,或者用户被认为是匿名的,请求被切换到该特殊的本地“匿名”帐户
  • 当您通过启用传入用户的模拟来修复上述问题时,您将遇到“NTLM一跳地狱”问题—传入凭据不能在其他服务器上使用(Kerberos是一种解决方案,但在大多数情况下不太可能可用)
  • 当您通过禁用模拟(或在进程的帐户而不是传入用户的帐户下运行代码)并使进程在域帐户(或实际具有web服务权限的其他帐户)下运行来修复第一个问题时您将遇到这样一个事实:您可能正在为用户提供获取他们本不应该访问的数据的可能性

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

我现在没有时间深入了解原因,但我可以说这与我的代理设置有关。为my box切换到不同的代理提供程序可以缓解此问题。这个内部事务应该一起绕过代理,我不明白为什么IIS的行为会与其他机制不同。我很不情愿地将此标记为答案,并希望检查代理设置的小通知对某人有所帮助。很抱歉,这没有更具体。

从何处开始:您的cassini应用程序可能正在使用您的用户id运行。另一方面,IIS Express可能正在使用不同的Windows标识运行。可能是IUSR(我不知道IIS Express)。远程服务可能使用Windows身份验证,并且不允许匿名访问。因此,您需要在远程服务器上的IIS vdir上授予IIS Express标识的权限(可能是machine\IUSR,其中machine是运行IIS Express的计算机的名称)。@Cheeso我应该发布带有问题的代码。我正在提供身份验证,因此我感到困惑。我试图访问的服务正在另一台服务器上运行。我在问题中添加了代码,显示了如何访问它。此代码为我希望进行身份验证的用户提供网络凭据。我不认为在发出请求时模拟起作用(但我可能误解了您的回答)。我的回答与您现在的情况无关:它假设Windows auth,但您的服务根据示例代码使用基本auth。不,我不知道为什么它不起作用。