0

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

当从运行在 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()));
}
4

2 回答 2

0

在 Web 服务端使用 Windows 身份验证时您将遇到/将遇到的问题列表:

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

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

于 2012-06-16T04:26:54.610 回答
0

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

于 2012-06-18T19:20:05.573 回答