C# Can';无法使用HttpClient获取API资源
我使用的是Identity Server4,我使用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
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);
}