【问题标题】:403 when calling API from Azure App Service从 Azure 应用服务调用 API 时出现 403
【发布时间】:2018-02-24 06:40:44
【问题描述】:

我有一个奇怪的问题。我有一个 .NET Core 应用程序,它在本地机器上运行良好并通过了单元测试。

在应用程序内部,它基本上调用了我们的平台网络服务:

using( WebClient client = new WebClient() )
{
    NetworkCredential creds = new NetworkCredential(_userName, _password);
    CredentialCache credCache = new CredentialCache();
    credCache.Add(new System.Uri(_baseUrl), "Basic", creds);
    client.Credentials = credCache;

    var url = _baseUrl + "/api/v1/Pricing/Rates";
    client.Headers.Add(HttpRequestHeader.ContentType, "application/json");    
    var request = JsonConvert.SerializeObject(data);
    System.Console.Out.WriteLine(request);      
    var response = client.UploadString(url, request);
    var responseObject = JObject.Parse(response);
    var products = responseObject["PricingProducts"].Children();

    var result = new Dictionary<string, double>();
    foreach( var product in products ) 
    {
        result.Add(product.Value<string>("LoanProgramName"), 
                   product.Value<double>("Rate"));
    }
    return result;
}

当我使用 dotnet run 在本地计算机上执行此操作时,一切正常。单元测试也很好用。 App Service 上的日志并没有告诉我太多信息,只是我从平台 Web 服务收到了 403。

ers.RatesController.Get (AlexaRates) with arguments ((null)) - ModelState is Valid
2018-02-24 06:37:44.418 +00:00 [Information] Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Executed action AlexaRates.Controllers.RatesController.Get (AlexaRates) in 201.3483ms
2018-02-24 06:37:44.447 +00:00 [Error] Microsoft.AspNetCore.Server.Kestrel: Connection id "0HLBRA4B41EO8", Request id "0HLBRA4B41EO8:00000002": An unhandled exception was thrown by the application.
System.Net.WebException: The remote server returned an error: (403) Forbidden.
   at System.Net.HttpWebRequest.GetResponse()
   at System.Net.WebClient.GetWebResponse(WebRequest request)
   at System.Net.WebClient.DownloadBits(WebRequest request, Stream writeStream)
   at System.Net.WebClient.UploadBits(WebRequest request, Stream readStream, Byte[] buffer, Int32 chunkSize, Byte[] header, Byte[] footer)
   at System.Net.WebClient.UploadDataInternal(Uri address, String method, Byte[] data, WebRequest& request)
   at System.Net.WebClient.UploadString(Uri address, String method, String data)
   at Rates.RetrieveLatest() in D:\home\site\repository\AlexaRates\Rates.cs:line 50
   at AlexaRates.Controllers.RatesController.Get() in D:\home\site\repository\AlexaRates\Controllers\RatesController.cs:line 22
   at lambda_method(Closure , Object , Object[] )
   at Microsoft.Exten

有没有人经历过类似的事情?我看到一堆 403 帖子,但它们主要是关于人们调用托管在服务上的 REST API 而不是调用。

【问题讨论】:

  • 403 通常意味着您的资源由于达到配额限制而受到限制或停止。请尝试扩展您的应用并重试。
  • 您的服务端点是否受到某种授权策略的保护? 403 响应表明您是授权用户(否则您将得到 401),但没有访问请求端点的权限。
  • 嗨!谢谢!我刚刚将应用服务计划更新为基本(50 美元/月),结果还是一样。还有其他想法吗?端点可以从我的单元测试中访问。
  • 我在 API 上确实有凭据,并且代码是相同的,所以我的假设是它以相同的方式发送红色

标签: azure .net-core azure-web-app-service


【解决方案1】:

403禁止错误通常表示服务器理解请求但拒绝授权。

  1. 根据您的错误信息,错误似乎发生在 Rates 类和 RatesController 类中,您没有向我们展示。您可以使用远程调试设置断点来检查这些类中的代码。
  2. 您说项目在本地运行良好,但在 Azure 中出现错误,因此请确保您已将所有项目和数据源发布到 Azure。检查“_baseUrl”是否来自 Azure。并确保您已启动 Azure 应用服务。
  3. 403 禁止错误可能还有其他原因。比如页面缓存和cookie的登录。您可以参考此article 了解如何修复 403 禁止错误。

403 禁止错误的原因

403 错误几乎总是由您尝试访问您无权访问的内容的问题引起的。

【讨论】:

  • 抱歉回复太长了。问题仍然存在。我仍然以某种方式得到 403,据我所知,API 应该返回 200 和数据。返回也太快,服务器无法分析。部署是通过 git deploy 进行的,所以我知道我在那里拥有的东西和我在本地机器上拥有的东西是相同的代码库,并且 URL 是相同的。
  • 我注意到你使用了凭证,你有设置权限吗?
  • 我在 API 上确实有凭据,并且代码是相同的,所以我的假设是它以相同的方式发送红色。
  • 这篇文章怎么样?(stackoverflow.com/questions/14184199/…)。该问题可能与 NetworkCredentials 类有关。希望我的回答对您有所帮助。
  • Mabye 只是更新您问题中的代码。并且错误消息刚刚提到了具体的行。
【解决方案2】:

我的解决方法是,我意识到我们的基础架构人员在 azure 应用程序上添加了 IP 限制。这就是为什么应用程序会以 403 反弹的原因。

我删除了“网络”->“访问限制”页面上的 IP 限制。

【讨论】:

    【解决方案3】:

    在尝试添加标头并执行各种其他操作后,最终结果是相同的 - 我在调用 Web 服务时收到 403 错误。

    解决方案是将 Web 应用程序转换为虚拟机,并使用老式设置在其中部署应用程序。该应用程序在那里工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-04
      • 2023-03-11
      • 2017-08-17
      • 2015-03-03
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 2018-03-16
      相关资源
      最近更新 更多