Al cargar la página /swagger/index.html, el navegador no puede encontrar los recursos de swagger-ui necesarios cuando se implementa en un servicio de aplicaciones en Azure y devuelve 404. Funciona cuando se ejecuta localmente. Mi configuración es:
services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Title = "Nexus WebApp", Version = "v1" }); options.CustomSchemaIds(type => type.ToString()); }); var builder = endpoints.CreateApplicationBuilder(); builder.UseSwagger(); builder.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "Nexus WebApp"); }); var pipeline = builder.Build(); endpoints.Map("/swagger", pipeline) .RequireAuthorization(new AuthorizeAttribute()); endpoints.Map("/swagger/index.html", pipeline) .RequireAuthorization(new AuthorizeAttribute()); endpoints.Map("/swagger/{documentName}/swagger.json", pipeline) .RequireAuthorization(new AuthorizeAttribute()); Lo intenté con una ruta relativa desde el punto final de swagger como ..\swagger\v1/swagger.json , intenté especificar un RoutePrefix, pero desafortunadamente fue en vano. Sé que se han hecho preguntas similares, pero lamentablemente ninguna parece ayudar.
¿Alguien tiene alguna pista?
Actualizar
Estos son los recursos por los que está devolviendo 404:
Sospecho que su implementación es incorrecta. Aquí está el código de Startup completo para configurar la interfaz de usuario de Swagger en NET Core:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Swashbuckle.AspNetCore.Swagger; namespace IDGSwaggerDemo { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion (CompatibilityVersion.Version_2_2); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Info { Version = "v1", Title = "Swagger Demo", Description = "Swagger Demo for ValuesController", TermsOfService = "None", Contact = new Contact() { Name = "Joydip Kanjilal", Email = "joydipkanjilal@yahoo.com", Url = "www.google.com" } }); }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "v1"); }); } } }Consulte este tutorial para obtener una implementación de Swagger más mejorada.
Finalmente, después de luchar con esto durante horas, logré que funcionara. Tenga en cuenta que tengo el requisito especial de tener una API web para la cual quiero que los controladores usen la autenticación de token de portador y, al mismo tiempo, quiero que la interfaz de usuario de Swagger esté protegida por OIDC.
He omitido partes en la clase que no son relevantes para esta respuesta.
var builder = WebApplication.CreateBuilder(args); builder.Services.AddMvc(); // Add authentication to web API builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration); // Add authentication to web app for Swagger authorization builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration); builder.Services.AddSwaggerGen(); builder.Services.AddAuthorization(options => { options.DefaultPolicy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme) .RequireAuthenticatedUser() .Build(); }); var app = builder.Build(); app.UseAuthentication(); app.UseAuthorization(); app.Use(async (context, next) => { if (context.Request.Path.StartsWithSegments("/swagger") && context.User.Identity?.IsAuthenticated == false) { await context.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme); } else { await next(); } }); app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1"); }); app.MapControllers(); app.Run();