Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';无法使用HttpClient获取API资源_C#_Asp.net Core_Identityserver4_Dotnet Httpclient_Asp.net Core Webapi - Fatal编程技术网

C# Can';无法使用HttpClient获取API资源

C# Can';无法使用HttpClient获取API资源,c#,asp.net-core,identityserver4,dotnet-httpclient,asp.net-core-webapi,C#,Asp.net Core,Identityserver4,Dotnet Httpclient,Asp.net Core Webapi,我使用的是Identity Server4,我使用ResourceOwnerPasswordgrant类型配置了一个web API项目 Web API方法: [HttpGet] [Authorize(Roles = "Badmin")] [Route("GetUsers")] public IActionResult GetUsers() { List<ApplicationUser> users = _context.ApplicationUsers .As

我使用的是Identity Server4,我使用
ResourceOwnerPassword
grant类型配置了一个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)
{
    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),
而第二种方法成功地获取了用户数据。

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

这就是为什么它在第二个例子中有效,而不是在第一个例子中

如果使用
ToListAsync

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

    return Json(users);
}
[HttpGet]
[授权(Roles=“Badmin”)]
[路由(“GetUsers”)]
公共异步任务GetUsers(){
var users=wait_context.ApplicationUsers.AsNoTracking().ToListAsync();
返回Json(用户);
}
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");
[HttpGet]
[Authorize(Roles = "Badmin")]
[Route("GetUsers")]
public async Task<IActionResult> GetUsers() {
    var users = await _context.ApplicationUsers.AsNoTracking().ToListAsync();

    return Json(users);
}