【问题标题】:ASP.Net Core WebAPI controller, authorize HTTPClient returning 401 Unauthorized errorASP.Net Core WebAPI 控制器,授权 HTTPClient 返回 401 Unauthorized 错误
【发布时间】:2021-10-06 03:33:19
【问题描述】:

我正在尝试使用可以从外部 API 读取的 HTTPClient 创建一个 APIcontroller。当我通过链接访问 API 时,我得到了所需的响应,但是当我尝试从代码连接到它时,我得到一个未经授权的错误。 Bearer token 和 Basic 授权我都试过了。

这是一个返回正确响应的示例请求 URL: RequestURLWithAuthorizationHeader

这是我尝试过的代码。

[Route("api/[controller]")]
[ApiController]
public class FrostMetAPIController : ControllerBase
{
  private readonly ILogger<FrostMetAPIController> _logger;
  private readonly IHttpClientFactory _httpClientFactory;
  private static readonly HttpClient _httpClient = new HttpClient
  {
      BaseAddress = new Uri("https://frost.met.no/observations/")
  };

  public FrostMetAPIController(ILogger<FrostMetAPIController> logger, IHttpClientFactory 
         httpClientFactory)
  {
            _logger = logger;
            _httpClientFactory = httpClientFactory;
  }

  [HttpGet("values")]
  public async Task<string> GetRates()
  {
     var httpClient = _httpClientFactory.CreateClient();
     try
     {                                
        var _CredentialBase64 = "XXX-xxx-XXX-xxx";                                
        var url = "sources=SN68290:0";
        url += "&referencetime=2019-01-01T12:00:00.000Z/2020-06-30T23:59:59Z";
        url += "&elements=wind_speed,%20max(wind_speed%20PT1H)";
        url += "&timeoffsets=PT0H";
        url += "&timeresolutions=PT1H";
        url += "&timeseriesids=0";
        url += "&performancecategories=C";
        url += "&exposurecategories=2&levels=10.0";
        url = url.Replace(" ", "%20");

       _httpClient.DefaultRequestHeaders
                           .Accept                           
 .Add(newMediaTypeWithQualityHeaderValue("application/json"));                           
                _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", $"Bearer {_CredentialBase64}");

        var response = await _httpClient.GetAsync("v0.jsonld?" + url);
        response.EnsureSuccessStatusCode();
       return await response.Content.ReadAsStringAsync();

     }
     catch (Exception)
     {
                throw;
            }
     }
  }

【问题讨论】:

  • 404 未找到,未授权。哪一个?此外,发布的代码无法编译。此外,您正在混合 httpClient_httpClient,这完全没有意义。
  • 这是401未经授权的错误。我已经纠正了错误。代码现在正在编译,我已经更新了一行。
  • 看起来像这样https://xxx-xxx-xx-xx@frost.met.no/sources/v0.jsonld?types=SensorSystem&amp;country=NO&amp;fields=name,geometry,id),其中 xxx-xx-xxx 是授权密钥。 API 没有很好的文档记录,所以我自己尝试一下。
  • 那么,如果您知道 URL 必须是这样的,那您究竟为什么不在代码中构建该 URL?您无法在任何地方添加密钥,您需要遵循 API 的预期
  • 我确实在代码中构建了它,但仍然得到 401 Unauthorized 的相同响应。

标签: c# asp.net-core-webapi dotnet-httpclient asp.net-apicontroller asp.net-authorization


【解决方案1】:

这就是我能够将基本身份验证令牌添加到 API url 的请求标头并从 API 检索所需响应的方式

  var _authenticationToken = Convert.ToBase64String(Encoding.UTF8.GetBytes("xxx-xx-xxxx"));
  _httpClient.DefaultRequestHeaders.Authorization = new 
             AuthenticationHeaderValue("Basic", _authenticationToken);

  var response = await _httpClient.GetAsync("v0.jsonld?"+ url);                
  var payload = response.Content.ReadAsStringAsync();                              

return payload.Result.ToString();

感谢@camiloterevinto 的帮助。

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 2017-09-20
    • 2016-12-04
    • 2018-10-30
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    相关资源
    最近更新 更多