/// <summary>
        /// 处理接口文档的用户认证
        /// </summary>
        /// <param name="app"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        private static IApplicationBuilder UseSwaggerCustomAuth(this IApplicationBuilder app, CustsomSwaggerOptions options)
        {
            if (options.AllowAnonymous)
            {
                return(app);
            }
            var currentAssembly = typeof(CustsomSwaggerOptions).GetTypeInfo().Assembly;

            app.Use(async(context, next) =>
            {
                var _method = context.Request.Method.ToLower();
                var _path   = context.Request.Path.Value;
                var subPath = string.IsNullOrEmpty(options.AppPath) ? "" : $"/{options.AppPath}"; //发布为虚拟站点时使用
                #region 自定义登录页
                if (_path.IndexOf($"/{options.RoutePrefix}") != 0)                                //非访问接口时直接返回
                {
                    await next();
                    return;
                }
                else if (_path == $"/{options.RoutePrefix}/login.html")
                {
                    //登录
                    if (_method == "get")
                    {
                        var stream    = currentAssembly.GetManifestResourceStream($"{currentAssembly.GetName().Name}.login.html");
                        byte[] buffer = new byte[stream.Length];
                        stream.Read(buffer, 0, buffer.Length);
                        context.Response.ContentType = "text/html;charset=utf-8";
                        context.Response.StatusCode  = StatusCodes.Status200OK;
                        await context.Response.Body.WriteAsync(buffer, 0, buffer.Length);
                        return;
                    }
                    else if (_method == "post")
                    {
                        var userModel = new CustomSwaggerAuth(context.Request.Form["userName"], context.Request.Form["userPwd"]);
                        if (!options.CustomAuthList.Any(e => e.UserName == userModel.UserName && e.UserPwd == userModel.UserPwd))
                        {
                            await context.Response.WriteAsync("login error!");
                            return;
                        }
                        var claims = new List <Claim>
                        {
                            new Claim(ClaimTypes.Name, userModel.UserName)
                        };
                        var identity = new ClaimsIdentity(ConfigurationHelper.SWAGGER_ATUH_COOKIE);
                        identity.AddClaims(claims);
                        var authProperties = new AuthenticationProperties
                        {
                            AllowRefresh = false,
                            ExpiresUtc   = DateTimeOffset.UtcNow.AddMinutes(120),
                            IsPersistent = false,
                        };
                        await context.SignOutAsync(ConfigurationHelper.SWAGGER_ATUH_COOKIE);//登出
                        await context.SignInAsync(ConfigurationHelper.SWAGGER_ATUH_COOKIE, new ClaimsPrincipal(identity), authProperties);

                        context.Response.Redirect($"{subPath}/{options.RoutePrefix}");
                        return;
                    }
                }
                else if (_path == $"/{options.RoutePrefix}/logout")
                {
                    //退出
                    context.Response.Cookies.Delete(ConfigurationHelper.SWAGGER_ATUH_COOKIE);
                    context.Response.Redirect($"{subPath}/{options.RoutePrefix}/login.html");
                    return;
                }
                #endregion
                else
                {
                    if (ConfigurationHelper.CustsomSwaggerOptions.UseAdminAuth)
                    {
                        var authentcationResult = await context.AuthenticateAsync(AdminAuthorizeAttribute.AuthenticationScheme);
                        if (!authentcationResult.Succeeded)
                        {
                            context.Response.Redirect("/Admin/Login/");
                            return;
                        }
                    }
                    else
                    {
                        var authentcationResult = await context.AuthenticateAsync(ConfigurationHelper.SWAGGER_ATUH_COOKIE);
                        if (!authentcationResult.Succeeded)
                        {
                            context.Response.Redirect($"{subPath}/{options.RoutePrefix}/login.html");
                            return;
                        }
                    }
                }
                await next();
            });
            return(app);
        }
 public static IServiceCollection AddSwaggerCustom(this IServiceCollection services, CustsomSwaggerOptions options)
 {
     services.AddSwaggerGen(c =>
     {
         if (options.ApiVersions == null)
         {
             return;
         }
         foreach (var version in options.ApiVersions)
         {
             c.SwaggerDoc(version, new Info {
                 Title = options.ProjectName, Version = version
             });
         }
         c.OperationFilter <SwaggerDefaultValueFilter>();
         options.AddSwaggerGenAction?.Invoke(c);
     });
     return(services);
 }
 private static IApplicationBuilder UseSwaggerCustomAuth(this IApplicationBuilder app, CustsomSwaggerOptions options)
 {
     if (options?.SwaggerAuthList.Count == 0)
         return app;
     var currentAssembly = typeof(CustsomSwaggerOptions).GetTypeInfo().Assembly;
     app.Use(async (context, next) =>
     {
         var _method = context.Request.Method.ToLower();
         var _path = context.Request.Path.Value;
         if (_path.IndexOf($"/{options.RoutePrefix}") != 0)
         {
             await next();
             return;
         }
         else if (_path == $"/{options.RoutePrefix}/login.html")
         {
             //登录
             if (_method == "get")
             {
                 var stream = currentAssembly.GetManifestResourceStream($"{currentAssembly.GetName().Name}.login.html");
                 byte[] buffer = new byte[stream.Length];
                 stream.Read(buffer, 0, buffer.Length);
                 context.Response.ContentType = "text/html;charset=utf-8";
                 context.Response.StatusCode = StatusCodes.Status200OK;
                 context.Response.Body.Write(buffer, 0, buffer.Length);
                 return;
             }
             else if (_method == "post")
             {
                 var userModel = new CustomSwaggerAuth(context.Request.Form["userName"], context.Request.Form["userPwd"]);
                 if (!options.SwaggerAuthList.Any(e => e.UserName == userModel.UserName && e.UserPwd == userModel.UserPwd))
                 {
                     await context.Response.WriteAsync("login error!");
                     return;
                 }
                 //context.Response.Cookies.Append("swagger_auth_name", userModel.UserName);
                 context.Response.Cookies.Append(SWAGGER_ATUH_COOKIE, userModel.AuthStr, new CookieOptions()
                 {
                     Expires = DateTime.Now.AddMonths(1)
                 });
                 context.Response.Redirect($"/{options.RoutePrefix}");
                 return;
             }
         }
         else if (_path == $"/{options.RoutePrefix}/logout")
         {
             //退出
             context.Response.Cookies.Delete(SWAGGER_ATUH_COOKIE);
             context.Response.Redirect($"/{options.RoutePrefix}/login.html");
             return;
         }
         else
         {
             if (!options.SwaggerAuthList.Any(s => !string.IsNullOrEmpty(s.AuthStr) && s.AuthStr == context.Request.Cookies[SWAGGER_ATUH_COOKIE]))
             {
                 context.Response.Redirect($"/{options.RoutePrefix}/login.html");
                 return;
             }
         }
         await next();
     });
     return app;
 }
 public static IServiceCollection AddSwaggerCustom(this IServiceCollection services, CustsomSwaggerOptions options)
 {
     services.AddSwaggerGen(c =>
     {
         if (options.ApiVersions == null)
         {
             return;
         }
         foreach (var version in options.ApiVersions)
         {
             c.SwaggerDoc(version, new Info {
                 Title = options.ProjectName, Version = version
             });
         }
         c.TagActionsBy(s =>
         {
             if (string.IsNullOrEmpty(s.ActionDescriptor.RouteValues["area"]))
             {
                 return(s.ActionDescriptor.RouteValues["controller"]);
             }
             return(s.ActionDescriptor.RouteValues["area"] + "_" + s.ActionDescriptor.RouteValues["controller"].ToLower());
         });
         c.OperationFilter <SwaggerDefaultValueFilter>();
         options.AddSwaggerGenAction?.Invoke(c);
     });
     return(services);
 }
 public static IApplicationBuilder UseSwaggerCustom(this IApplicationBuilder app, CustsomSwaggerOptions options)
 {
     app
     .UseSwaggerCustomAuth(options)
     .UseSwagger(opt =>
     {
         if (options.UseSwaggerAction == null) return;
         options.UseSwaggerAction(opt);
     })
     .UseSwaggerUI(c =>
     {
         c.RoutePrefix = options.RoutePrefix;
         c.DocumentTitle = options.ProjectName;
         if (options.UseCustomIndex)
         {
             c.UseCustomSwaggerIndex();
         }
         if (options.SwaggerAuthList.Count > 0)
         {
             c.ConfigObject["customAuth"] = true;
             c.ConfigObject["loginUrl"] = $"/{options.RoutePrefix}/login.html";
             c.ConfigObject["logoutUrl"] = $"/{options.RoutePrefix}/logout";
         }
         if (options.ApiVersions == null) return;// options.ApiVersions = new string[] { "v1" };
         foreach (var item in options.ApiVersions)
         {
             c.SwaggerEndpoint($"/swagger/{item}/swagger.json", $"{item}");
         }
         options.UseSwaggerUIAction?.Invoke(c);
     });
     return app;
 }