コード例 #1
0
        // 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();
            });
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        /// <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);
        }