【问题标题】:Can't get API resource using HttpClient无法使用 HttpClient 获取 API 资源
【发布时间】:2018-06-17 17:18:54
【问题描述】:

我正在使用 Identity Server4,并且我已经使用 ResourceOwnerPassword 授权类型配置了一个 Web API 项目。

Web API 方法:

[HttpGet]
[Authorize(Roles = "Badmin")]
[Route("GetUsers")]
public IActionResult GetUsers()
{
    List<ApplicationUser> users = _context.ApplicationUsers
        .AsNoTracking().ToListAsync().Result;

    return Json(users);
}

在我的控制台程序代码中:

if (response != null)
{
    using (HttpClient client = new HttpClient())
    {
        Console.WriteLine("AccessToken:" + Environment.NewLine + response.AccessToken);
        Console.WriteLine(Environment.NewLine);

        HttpResponseMessage resourceOwnerPasswordResponse = await client.GetAsync("https://localhost:44366/identity/GetUsers");

        client.DefaultRequestHeaders.Add("Bearer", response.AccessToken);

        if (!resourceOwnerPasswordResponse.IsSuccessStatusCode)
        {
            Console.WriteLine(resourceOwnerPasswordResponse.StatusCode);
            Console.WriteLine("HttpClient ResourceOwnerPassword Result: " + resourceOwnerPasswordResponse.StatusCode);
            Console.WriteLine(Environment.NewLine);
        }
        else
        {
            string result = await resourceOwnerPasswordResponse.Content.ReadAsStringAsync();
            Console.WriteLine("HttpClient ResourceOwnerPassword Result: " + Environment.NewLine + JsonConvert.DeserializeObject(result));
            Console.WriteLine(Environment.NewLine);
        }
    }
}

第二种方式:

if (response != null)
{
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("https://localhost:44366/identity/GetUsers");
    httpWebRequest.ContentType = "application/json";
    httpWebRequest.Headers.Add("Authorization", string.Format("Bearer {0}", response.AccessToken));
    httpWebRequest.Method = "GET";

    HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();

    string result = string.Empty;

    using (Stream responseStream = httpWebResponse.GetResponseStream())
    {
        if (responseStream != null)
        {
            StreamReader streamReader = new StreamReader(responseStream);
            result = streamReader.ReadToEnd();
            streamReader.Close();
        }
    }

    Console.WriteLine("HttpWebRequest ResourceOwnerPassword Result: " + Environment.NewLine + JsonConvert.DeserializeObject(result));
}

查看控制台结果:

所以我的问题是为什么当我使用HttpCliet 时,我得到未经授权(代码 401), 而第二种方式成功获取了用户数据。

【问题讨论】:

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


    【解决方案1】:

    令牌应该在发出请求之前添加到客户端,并且您需要确保它是授权标头。

    client.DefaultRequestHeaders.Authorization = 
        new AuthenticationHeaderValue("Bearer", response.AccessToken);
    
    //OR
    
    //client.DefaultRequestHeaders
    //  .Add("Authorization", string.Format("Bearer {0}", response.AccessToken));
    
    var resourceOwnerPasswordResponse = await client.GetAsync("https://localhost:44366/identity/GetUsers");
    

    这就是为什么它在第二个示例而不是第一个示例中起作用

    如果使用ToListAsync,Web API 操作也应该是异步的

    [HttpGet]
    [Authorize(Roles = "Badmin")]
    [Route("GetUsers")]
    public async Task<IActionResult> GetUsers() {
        var users = await _context.ApplicationUsers.AsNoTracking().ToListAsync();
    
        return Json(users);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      相关资源
      最近更新 更多