Swagger в .net core 5 дает мне ошибку - не была указана аутентификацияScheme, и не было найдено DefaultChallengeScheme

Когда я запрашиваю любую конечную точку API из пользовательского интерфейса Swagger, я получаю следующую ошибку

System.InvalidOperationException: не была указана аутентификацияScheme, и не было найдено DefaultChallengeScheme. Схемы по умолчанию можно установить с помощью AddAuthentication (строка defaultScheme) или AddAuthentication (Action configureOptions).

в Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync (контекст HttpContext, схема String, свойства AuthenticationProperties)

в Microsoft.AspNetCore.Authorization.Policy.AuthorizationMiddlewareResultHandler.HandleAsync (далее RequestDelegate, контекст HttpContext, политика AuthorizationPolicy, PolicyAuthorizationResult authorizeResult)

в Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke (контекст HttpContext)

в Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (контекст HttpContext)

в Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke (HttpContext httpContext)

в Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke (HttpContext httpContext, ISwaggerProvider swaggerProvider)

в Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext)

ЗАГОЛОВКИ

=======

Принять: /

Принятие кодировки: gzip, deflate

Accept-Language: en-US, en; q = 0,5

Авторизация: Знаменосец eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOiIzIiwiTG9naW5JZCI6ImFkbWluIiwiVXNlclR5cGVJZCI6IjEiLCJFbWFpbCI6ImEiLCJNb2JpbGUiOiJhIiwianRpIjoiMWU1MDY3ODAtMWRjNS00MDYzLWFkMTktMDdlMjg4MzAxOWVjIiwiZXhwIjoxNjIzNDYzNjQ4LCJpc3MiOiJlZHVjYXJlLmNvbSIsImF1ZCI6ImVkdWNhcmUuY29tIn0.G2-D_oIdwUDw_3iz87jxWBIMabFpLlR5ASjCr109kNM

Подключение: keep-alive

Хост: localhost: 21068

Ссылка: http: // localhost: 21068 / swagger / index.html

конфигурация Swagger приведена ниже

public void ConfigureServices(IServiceCollection services)
        {
services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "Edu Care API", Version = "v1" });

                c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    Description = "Please insert the authorization token into field",
                    Name = "Authorization",
                    BearerFormat = "JWT",
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.Http,
                    Scheme = "bearer"
                });
                c.AddSecurityRequirement(new OpenApiSecurityRequirement {
                {
                    new OpenApiSecurityScheme
                    {
                    Reference = new OpenApiReference
                    {
                        Type = ReferenceType.SecurityScheme,
                        Id = "Bearer"
                    }
                    },
                    new string[] { }
                }
                });

            });
        }


 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {

            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "Edu Care API v1");
                //c.RoutePrefix = string.Empty;
            });

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

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapRazorPages();
            });

}

мой базовый контроллер, как показано ниже

 [Authorize]
    [ApiController]
    [Route("api/[controller]")]
    public class BaseController : ControllerBase
    {

    }

моя конечная точка API, как показано ниже

[Route("api/[controller]")]
    [ApiController]    
    public class AcademicFeeConfigurationController : BaseController
    {

 [HttpGet]
        [Route("[action]")]
        public IActionResult GetFeeRelatedAllSli()
        {
            try
            {
                object sli = new
                {
                    FeeTypeSli = new FeeTypeService(context).FeeTypeSli(),
                    ClassInfoSli = new ClassInfoService(context).ClassInfoSli(),
                    SectionSli = new SectionInfoService(context).SectionInfoSli(),
                    AcademicSessionSli = new AcademicSessionInfoService(context).AcademicSessionSli(),
                };

                return Ok(sli);
            }
            catch (Exception ex)
            {
               
                ResponseModel.Notification = UtilityHelper.CreateNotification(Helpers.ExceptionMessage(ex), Enums.NotificationType.Error);
                return StatusCode(500, ResponseModel);
            }
        }
}

Может чего-то не хватает. Может ли кто-нибудь дать какое-либо предложение / решение


person Md. Nazrul Islam    schedule 11.06.2021    source источник
comment
Есть ли у вас какие-либо настройки аутентификации внутри метода ConfigureServices startup.cs? Кажется, вы не устанавливаете какую-либо sechma аутентификации и используете Authorize внутри контроллера api.   -  person Brando Zhang    schedule 11.06.2021


Ответы (1)


Дело не в Swagger, в вашем коде отсутствует AddAuthentication (). В приведенном ниже примере регистрируются схемы аутентификации (JWT и Cookie) при использовании JWT в качестве схемы по умолчанию. Дополнительная информация в документации .

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => Configuration.Bind("JwtSettings", options))
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => Configuration.Bind("CookieSettings", options));
person Ibrahim Abdelkareem    schedule 11.06.2021