【问题标题】:Accessing remote web service from IIS Express results in 403 forbidden从 IIS Express 访问远程 Web 服务导致 403 被禁止
【发布时间】:2012-06-16 01:48:24
【问题描述】:

当我尝试从在 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()));
}

【问题讨论】:

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

标签: c# iis-express http-status-code-403 cassini


【解决方案1】:

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

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

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

【讨论】:

  • 我尝试访问的服务正在另一台服务器上运行。我在我的问题中添加了代码,显示了我如何访问它。此代码为我希望与之进行身份验证的用户提供了 NetworkCredential。我不认为在提出请求时冒充会起作用(但我可能会从您的回答中误解某些内容)。
  • 我的回答现在与您的情况无关:它假设 Windows 身份验证,但您的服务使用基于您的示例代码的基本身份验证。不,我不确定为什么它不起作用。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多