Получить JSON из Api - приложение WPF

Я пытаюсь получить данные из веб-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();
    }

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

Azaz ul Haq 14.05.2018 13:09

Сначала похоже, что косая черта в "/ get" лишняя. [Route ("get")] должно быть достаточно. Во-вторых, можете ли вы поделиться кодом, в котором вы вызываете метод AddPolicy, например: auth.AddPolicy («Bearer», new AuthorizationPolicyBuilder () .AddAuthenticationSchemes (JwtBearerDefaults.AuthenticationSc‌ heme‌) .RequireAuthe‌ nticated‌ildUser ().

Azaz ul Haq 14.05.2018 13:35

Я предполагаю, что служба авторизации также добавляется с помощью services.AddAuthorization. Можем ли мы получить эту строку вместе с уже добавленным AddAuthentication (...).

Azaz ul Haq 14.05.2018 14:11

Я очень надеюсь, что все мои правки помогут прояснить мой вопрос.

Alexandra Damaschin 14.05.2018 14:32

Я считаю, что вам не хватает services.AddAuthorization (...) в методе ConfigureServices. Я добавил следующую строку кода для аутентификации на основе носителя JWT: services.AddAuthorization (auth => {auth.AddPolicy ("Bearer", new AuthorizationPolicyBuilder () .AddAuthenticationSchemes (JwtBearerDefaults.AuthenticationSc‌ heme‌heser). .Build‌ ());});

Azaz ul Haq 14.05.2018 14:55

Это не помогло. У меня в DefaultRequestHeaders.Authorization «Токен на предъявителя». Я думал, что токен не вводится в заголовок, но это так. Я новичок в wpf, поэтому, возможно, я что-то упускаю,

Alexandra Damaschin 14.05.2018 15:12

Код, написанный на WPF / C# для вызова метода get, в порядке. Хотя это можно улучшить, поскольку вы создаете экземпляр объекта httpClient, несмотря на то, что уже инициализировали объект client. Это просто для чистого кода. Даже с этим кодом вы не должны получить 401, поскольку вы используете объект client, для которого токен авторизации уже добавлен в заголовок. Единственное, что у меня вызывает подозрения, это токен, может он просрочен или неправильный.

Azaz ul Haq 14.05.2018 15:48

Я думал то же самое, но я проверил токен и добавил, что срок его действия истекает через один день.

Alexandra Damaschin 14.05.2018 15:50

Позвольте нам продолжить обсуждение в чате.

Azaz ul Haq 14.05.2018 15:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
214
0

Другие вопросы по теме