Я пытаюсь получить данные из веб-API. Я выполняю асинхронный вызов веб-API, чтобы вернуть данные. Клиент должен быть авторизован, поэтому я вставляю токен в заголовок.
Вот мой метод вызова кнопки.
private async void button1_Click(object sender, RoutedEventArgs e)
{
//I checked the token and is good
var accessToken = token;
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
client.BaseAddress = new Uri("http://localhost:5001/movies/");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
using (var httpClient = new HttpClient() { BaseAddress = client.BaseAddress })
{
HttpResponseMessage response = await client.GetAsync("get");
var content = await response.Content.ReadAsStringAsync();
MessageBox.Show(content);
}
}
API: http: // локальный: 5001 / фильмы / получить
Api возвращает список фильмов и работает без [Авторизоваться]
Я всегда получаю 401, но не понимаю почему?
Изменить 1: тот же api работает нормально, когда я пытаюсь получить данные от другого клиента (например, веб-сайта)
Изменить 2: разрешить атрибут
[Authorize(AuthenticationSchemes = "Bearer")]
[Route("movies")]
public class MoviesController : ControllerBase
{
[HttpGet]
[Route("/get")]
public IActionResult Get()
{
return Ok(new[]
{
new { Id = 1, Title = "Never Say Never Again"},
new { Id = 2, Title = "Diamonds Are Forever "},
new { Id = 3, Title = "You Only Live Twice "}
});
}
}
Изменить 3: это из запуска веб-API.
public void ConfigureServices(
IServiceCollection services)
{
services.AddAuthentication(IdentityServerAuthenticationDefaults.JwtAuthenticationScheme)
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000"; // Auth Server
options.RequireHttpsMetadata = false; // only for development
options.ApiName = "fiver_auth_api"; // API Resource Id
});
services.AddMvc();
}
Авторитет находится на порту 5000, и я запускаю его одновременно с we api. n этот порт является Identity Server (войдите в систему для авторизации api, отсюда идет токен).
Изменить 4:
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env)
{
app.UseDeveloperExceptionPage();
app.UseAuthentication();
app.UseMvcWithDefaultRoute();
}
Сначала похоже, что косая черта в "/ get" лишняя. [Route ("get")] должно быть достаточно. Во-вторых, можете ли вы поделиться кодом, в котором вы вызываете метод AddPolicy, например: auth.AddPolicy («Bearer», new AuthorizationPolicyBuilder () .AddAuthenticationSchemes (JwtBearerDefaults.AuthenticationSc heme) .RequireAuthe nticatedildUser ().
Я предполагаю, что служба авторизации также добавляется с помощью services.AddAuthorization. Можем ли мы получить эту строку вместе с уже добавленным AddAuthentication (...).
Я очень надеюсь, что все мои правки помогут прояснить мой вопрос.
Я считаю, что вам не хватает services.AddAuthorization (...) в методе ConfigureServices. Я добавил следующую строку кода для аутентификации на основе носителя JWT: services.AddAuthorization (auth => {auth.AddPolicy ("Bearer", new AuthorizationPolicyBuilder () .AddAuthenticationSchemes (JwtBearerDefaults.AuthenticationSc hemeheser). .Build ());});
Это не помогло. У меня в DefaultRequestHeaders.Authorization «Токен на предъявителя». Я думал, что токен не вводится в заголовок, но это так. Я новичок в wpf, поэтому, возможно, я что-то упускаю,
Код, написанный на WPF / C# для вызова метода get, в порядке. Хотя это можно улучшить, поскольку вы создаете экземпляр объекта httpClient, несмотря на то, что уже инициализировали объект client. Это просто для чистого кода. Даже с этим кодом вы не должны получить 401, поскольку вы используете объект client, для которого токен авторизации уже добавлен в заголовок. Единственное, что у меня вызывает подозрения, это токен, может он просрочен или неправильный.
Я думал то же самое, но я проверил токен и добавил, что срок его действия истекает через один день.
Позвольте нам продолжить обсуждение в чате.





Можете ли вы обновить вопрос с помощью фрагмента кода, в котором вы применили атрибут [Authorize]?