Токен JWT API AspNetCore работает в PostMan, но не с HttpClient

#c# #asp.net-identity #asp.net-core-webapi

#c# #asp.net-identity #asp.net-core-webapi

Вопрос:

Я пытаюсь вызвать API с HttpClient помощью, и когда я вызываю API без [Authorize] , я получаю всю информацию правильно. когда я добавляю атрибут, я получаю несанкционированную ошибку 401. Самое смешное, что он работает правильно, когда я вызываю токен на предъявителя из Postman.

Я видел несколько сообщений, в которых говорится, что нужно добавить app.UseAuthentication(); , прежде app.UseAuthorization(); чем я это сделал.

Ниже приведен код, который я использую для вызова API. Я заметил, что я звоню http://localhost:5000/api/accounts , но получаю ответ от https://localhost:5001/api/accounts

     protected HttpClient CreateClient()
    {
        var client = new HttpClient { BaseAddress = new Uri(ConfigurationManager.AppSettings["ServerAddress"]) };
        if(_securityService.HasToken)
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _securityService.Token);
        }

        return client;
    }

    protected async Task<T> GetAsync<T>(string url, CancellationToken cancellationToken = default, params object[] parameters)
    {
        using var client = CreateClient();
        if (parameters.Any())
            url = string.Format(url, parameters);
        var response = await client.GetAsync(url, cancellationToken);

        if (response.IsSuccessStatusCode)
        {
            var stringContent = await response.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<T>(stringContent);
        }
        else
        {
            //TODO: Add Logger and log Result
            return default;
        }
    }
  

Адрес ApiAddress клиента
образ клиента

Ответное сообщение

Ответное сообщение

У меня здесь 2 вопроса, почему это изменило uri запроса, может кто-нибудь, пожалуйста, объяснить, почему это будет работать в postman, но не с использованием HttpClient.

Я подумал об этом и подумал, что мне тоже следует добавить сюда код сервера.

         services.AddDefaultIdentity<ApplicationUser>()
            .AddRoles<IdentityRole>()
            .AddEntityFrameworkStores<SchedulerContext>()
            .AddDefaultTokenProviders();


        services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(options =>
            {
                var securityKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Constants.ConstantsToAddToSecrets.Seceret));
                options.RequireHttpsMetadata = false;
                options.SaveToken = true;
                options.TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = securityKey,
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });

        services.AddAuthorization(options =>
        {
            options.DefaultPolicy =
                new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme)
                    .RequireAuthenticatedUser()
                    .Build();

            options.AddPolicy(Roles.Manager, policy => policy.RequireClaim(Roles.Manager));
            options.AddPolicy(Roles.User, policy => policy.RequireClaim(Roles.User));
            options.AddPolicy(Roles.Admin, policy => policy.RequireClaim(Roles.Admin));
            options.InvokeHandlersAfterFailure = true;

        });
        services.Configure<IdentityOptions>(options =>
        {
            options.Password.RequireDigit = true;
            options.Password.RequireNonAlphanumeric = false;
            options.Password.RequireLowercase = false;
            options.Password.RequireUppercase = false;
            options.Password.RequiredLength = 6;

            options.User.RequireUniqueEmail = false;

            options.Tokens.AuthenticatorIssuer = ConstantsToAddToSecrets.Issuer;
        });
  

Комментарии:

1. Есть ли у вас app.UseHttpsRedirection(); свой Configure метод? Это может быть причиной перенаправления

2. ДА. У меня это есть. в этом и заключалась проблема.

3. Используете ли вы один и тот же токен для Postman и клиента?

4. да, это тот же токен.