@GineTik

При обращении к методу с атрибутом [Authorize] возвращается код 404, из-за чего?

Привет. Я использую jwt авторизацию со swagger-ом.
Сначала я авторизируюcь с помощью метода Login который возвращает мне jwt токен.

Вот как я генерирую этот токен:
var claims = new List<Claim>
            {
                new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
                new Claim(ClaimTypes.Email, user.Email),
            };

            var token = new JwtSecurityToken(
                issuer: _configuration["User:Jwt:Issuer"],
                audience: _configuration["User:Jwt:Audience"],
                claims: claims,
                expires: DateTime.UtcNow.AddDays(Convert.ToDouble(_configuration["User:Jwt:ExpireDays"])),
                signingCredentials: new SigningCredentials(
                    new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["User:Jwt:SecretKey"])),
                    SecurityAlgorithms.HmacSha256Signature
                )
            );

            return new JwtSecurityTokenHandler().WriteToken(token);


потом я передаю этот токен для swagger авторизации, вот как она реализована:
builder.Services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
                c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    Description = "JWT Authorization header using the Bearer scheme. Example: \"Bearer {token}\"",
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.ApiKey,
                    Scheme = "Bearer",
                    BearerFormat = "JWT"
                });
                c.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Reference = new OpenApiReference
                            {
                                Type = ReferenceType.SecurityScheme,
                                Id = "Bearer"
                            }
                        },
                        new string[] {}
                    }
                });
            });


Дальше я пытаюсь сделать запрос к действию на которое я навешал атрибут [Authorize]. Swagger в заголовок передает следующее: Authorization: Bearer {token}. Но мне возвращается код 404 и самое интересное, что если я уберу атрибут авторизации, то действие будет найдено.

Вот параметры валидации токена:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
                    //options.SaveToken = true;
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuer = true,
                        ValidateAudience = true,
                        ValidateLifetime = false,
                        ValidateIssuerSigningKey = true,
                        ValidIssuer = configuration["User:Jwt:Issuer"],
                        ValidAudience = configuration["User:Jwt:Audience"],
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["User:Jwt:SecretKey"]))
                    };
                });


А вот как выглядит токен (секретная фраза - 1234567890qazwsxe):
eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjMiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9lbWFpbGFkZHJlc3MiOiJ1c2VyQGV4YW1wbGUuY29tIiwiZXhwIjoxNjgxMTEzODM2LCJpc3MiOiJhdXRoU2VydmljZSIsImF1ZCI6InJlc291cnNlU2VydmVyIn0.hIsj1b0pGCqk6iBW2GYZ1aO7x7QokUcq8CT4D0TPItg


И еще вот мой pipeline:
var app = builder.Build();

            app.UseCustomExceptionHandler();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            //app.UseHttpsRedirection();

            app.UseCors();

            app.UseAuthentication();
            app.UseAuthorization();


            app.MapControllers();

            app.Run();


Если есть что-то еще, то с радостью предоставлю больше информации.
Спасибо за любую помощь!
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
@DD-var
[Authorize(AuthenticationSchemes = "Bearer")]
либо в программ
builder.Services.AddAuthorization(options =>
{
    var policy = new AuthorizationPolicyBuilder("Bearer").RequireAuthenticatedUser().Build();

    options.DefaultPolicy =policy;
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы