// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseLiveReload(); } else { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); var swaggerOptions = new CustomSwaggerOptions(); Configuration.GetSection("SwaggerOptions").Bind(swaggerOptions); app.UseSwagger(option => { option.RouteTemplate = swaggerOptions.JsonRoute; }); app.UseSwaggerUI(options => { options.SwaggerEndpoint(swaggerOptions.UiEndpoint, swaggerOptions.Description); }); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapBlazorHub(); endpoints.MapFallbackToPage("/_Host"); endpoints.MapControllers(); }); }
/// <summary> /// 注册自定义Swagger /// </summary> /// <param name="services">服务集合</param> /// <param name="options">自定义Swagger选项</param> /// <returns></returns> public static IServiceCollection AddSwaggerCustom(this IServiceCollection services, CustomSwaggerOptions options) { services.AddSwaggerGen(o => { if (options.ApiVersions == null) { options.AddSwaggerGenAction?.Invoke(o); return; } foreach (var version in options.ApiVersions) { if (o.SwaggerGeneratorOptions.SwaggerDocs.ContainsKey(version.Version)) { continue; } o.SwaggerDoc(version.Version, new Info() { Title = options.ProjectName, Version = version.Version }); } o.OperationFilter <ApiVersionDefaultValueOperationFilter>(); options.AddSwaggerGenAction?.Invoke(o); }); return(services); }
/// <summary> /// 注册自定义Swagger /// </summary> /// <param name="services">服务集合</param> /// <param name="options">自定义Swagger选项</param> public static IServiceCollection AddSwaggerCustom(this IServiceCollection services, CustomSwaggerOptions options) { services.AddSwaggerGen(o => { BuildContext.Instance.Options.SwaggerGenOptions = o; options.AddSwaggerGenAction?.Invoke(o); BuildContext.Instance.Build(); }); return(services); }
/// <summary> /// 添加Swagger自定义授权访问 /// </summary> private static IApplicationBuilder UseSwaggerCustomAuthorization(this IApplicationBuilder app, CustomSwaggerOptions options) { if (options?.SwaggerAuthorizations.Count == 0) { return(app); } app.Use(async(context, next) => { var method = context.Request.Method.ToLower(); var path = context.Request.Path.Value; if (path.IndexOf($"/{options.RoutePrefix}", StringComparison.InvariantCultureIgnoreCase) != 0) { await next(); return; } if (path == $"/{options.RoutePrefix}/login.html") { // 登录 if (method == "get") { context.Response.WriteSwaggerPage("login"); return; } if (method == "post") { var user = new CustomSwaggerAuthorization(context.Request.Form["userName"], context.Request.Form["password"]); if (!options.SwaggerAuthorizations.Any(x => x.UserName == user.UserName && x.Password == user.Password)) { await context.Response.WriteAsync("Login error!"); return; } context.Response.Cookies.Append(SWAGGER_AUTH_COOKIE, user.Token, new CookieOptions() { Expires = DateTimeOffset.Now.AddMonths(1) }); context.Response.Redirect($"/{options.RoutePrefix}"); return; } } if (path == $"/{options.RoutePrefix}/logout") { // 退出 context.Response.Cookies.Delete(SWAGGER_AUTH_COOKIE); context.Response.Redirect($"/{options.RoutePrefix}/login.html"); return; } if (!options.SwaggerAuthorizations.Any(x => !string.IsNullOrWhiteSpace(x.Token) && x.Token == context.Request.Cookies[SWAGGER_AUTH_COOKIE])) { context.Response.Redirect($"/{options.RoutePrefix}/login.html"); return; } await next(); }); return(app); }
/// <summary> /// 使用自定义Swagger /// </summary> /// <param name="app">应用构建器</param> /// <param name="options">自定义Swagger选项</param> public static IApplicationBuilder UseSwaggerCustom(this IApplicationBuilder app, CustomSwaggerOptions options) { BuildContext.Instance.ServiceProvider = app.ApplicationServices; var internalOptions = BuildContext.Instance.Options; internalOptions.RoutePrefix = options.RoutePrefix; internalOptions.ProjectName = options.ProjectName; internalOptions.EnableCustomIndex = options.UseCustomIndex; internalOptions.EnableAuthorization = options.SwaggerAuthorizations.Count > 0; internalOptions.ApiVersions = options.ApiVersions; internalOptions.EnableApiVersion = options.EnableApiVersion; internalOptions.ApiGroupType = options.ApiGroupType; app.UseSwaggerCustomAuthorization(options) .UseSwagger(o => { BuildContext.Instance.Options.SwaggerOptions = o; options.UseSwaggerAction?.Invoke(o); }) .UseSwaggerUI(o => { BuildContext.Instance.Options.SwaggerUiOptions = o; o.RoutePrefix = internalOptions.RoutePrefix; o.DocumentTitle = internalOptions.ProjectName; // 启用自定义主页 if (internalOptions.EnableCustomIndex) { o.UseCustomSwaggerIndex(); } // 启用授权 if (internalOptions.EnableAuthorization) { o.ConfigObject.AdditionalItems["customAuth"] = true; o.ConfigObject.AdditionalItems["loginUrl"] = $"/{options.RoutePrefix}/login.html"; o.ConfigObject.AdditionalItems["logoutUrl"] = $"/{options.RoutePrefix}/logout"; } if (options.ApiVersions == null) { options.UseSwaggerUIAction?.Invoke(o); return; } options.UseSwaggerUIAction?.Invoke(o); }); return(app); }
/// <summary> /// 使用自定义Swagger /// </summary> /// <param name="app">应用构建器</param> /// <param name="options">自定义Swagger选项</param> /// <returns></returns> public static IApplicationBuilder UseSwaggerCustom(this IApplicationBuilder app, CustomSwaggerOptions options) { app.UseSwaggerCustomAuthorization(options) .UseSwagger(o => { options.UseSwaggerAction?.Invoke(o); }) .UseSwaggerUI(o => { o.RoutePrefix = options.RoutePrefix; o.DocumentTitle = options.ProjectName; if (options.UseCustomIndex) { o.UseCustomSwaggerIndex(); } if (options.SwaggerAuthorizations.Count > 0) { o.ConfigObject.AdditionalItems["customAuth"] = true; o.ConfigObject.AdditionalItems["loginUrl"] = $"/{options.RoutePrefix}/login.html"; o.ConfigObject.AdditionalItems["logoutUrl"] = $"/{options.RoutePrefix}/logout"; } if (options.ApiVersions == null) { options.UseSwaggerUIAction?.Invoke(o); return; } foreach (var item in options.ApiVersions) { var url = $"/swagger/{item.Version}/swagger.json"; var name = $"{(string.IsNullOrWhiteSpace(item.Description) ? item.Version : item.Description)}"; if (o.ExistsApiVersion(name, url)) { continue; } o.SwaggerEndpoint(url, name); } options.UseSwaggerUIAction?.Invoke(o); }); return(app); }