,NetFamework4.5.2+搭建带有Token验证的Swagger 及 隐藏指令接口方法

十年河东,十年河西,莫欺少年穷

学无止境,精益求精

1、新建一个webApi项目,并引用Swashbuckle,版本:5.6.0

 2、引用成功后,系统会自动生成一个SwaggerConfig.cs的文件,位于App_Start文件夹内,修改这个配置文件为:

using System.Web.Http;
using WebActivatorEx;
using Swashbuckle.Application;
using Swashbuckle.Swagger;
using System.Web.Http.Description;
using System.Collections.Generic;
using SwaggerSite;

[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]

namespace SwaggerSite
{
    public class SwaggerConfig
    {
        public static void Register()
        {
            var thisAssembly = typeof(SwaggerConfig).Assembly;

            GlobalConfiguration.Configuration
                .EnableSwagger(c =>
                {

                    c.SingleApiVersion("v1", "SwaggerSite");
                    c.IncludeXmlComments(string.Format("{0}/bin/SwaggerSite.XML", System.AppDomain.CurrentDomain.BaseDirectory));
                    c.OperationFilter<HttpAuthHeaderFilter>();

                })
                .EnableSwaggerUi(c =>
                {

                });
        }
    }
    public class HttpAuthHeaderFilter : IOperationFilter
    {
        public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
        {
            if (operation.parameters == null)
                operation.parameters = new List<Parameter>();

            operation.parameters.Add(new Parameter { name = "Authorization", @in = "header", description = "授权", required = false, type = "header" });

        }
    }
}

3、右键项目,选择属性-生成一栏,输出路径,XML文档文件为:bin\SwaggerSite.xml

 4、修改Api控制器为:

    /// <summary>
    /// 测试接口
    /// </summary>
    [RoutePrefix("api/Values")]
    public class ValuesController : ApiController
    {
        /// <summary>
        /// GET api/values
        /// </summary>
        /// <returns></returns>
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        /// <summary>
        /// GET api/values/5
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public string Get(int id)
        {
            return "value";
        }

        /// <summary>
        /// POST api/values
        /// </summary>
        /// <param name="value"></param>
        public void Post([FromBody] string value)
        {
        }

        /// <summary>
        /// PUT api/values/5
        /// </summary>
        /// <param name="id"></param>
        /// <param name="value"></param>
        public void Put(int id, [FromBody] string value)
        {
        }

        /// <summary>
        /// DELETE api/values/5
        /// </summary>
        /// <param name="id"></param>
        public void Delete(int id)
        {
        }
    }
View Code

运行项目:https://localhost:44372/swagger

安全性方面,生成的swagger可以使用授权,关于授权,C#这块可以使用JWT+Token验证。

关于JWT授权,可以参考大牛博客:JSON WEB TOKEN,简单谈谈TOKEN的使用及在C#中的实现

 纯属记录下,用到时,迅速搭建,万事大吉。

@2021-12-28 17:41:00 增加隐藏接口方法

using System.Web.Http;
using WebActivatorEx;
using Iot.WebSite;
using Swashbuckle.Application;
using Swashbuckle.Swagger;
using System.Web.Http.Description;
using System.Collections.Generic;
using System;
using System.Linq;

[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]

namespace Iot.WebSite
{
    public class SwaggerConfig
    {
        public static void Register()
        {
            var thisAssembly = typeof(SwaggerConfig).Assembly;

            GlobalConfiguration.Configuration
                .EnableSwagger(c =>
                    {
                        c.DocumentFilter<HiddenApiFilter>();
                        c.SingleApiVersion("v1", "Iot.WebSite");
                        c.IncludeXmlComments(string.Format("{0}/bin/Iot.WebSite.XML", System.AppDomain.CurrentDomain.BaseDirectory));
                        c.OperationFilter<HttpAuthHeaderFilter>();

                    })
                .EnableSwaggerUi(c =>
                    {
                         
                    });
        }
    }
    public class HttpAuthHeaderFilter : IOperationFilter
    {
        public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
        {
            if (operation.parameters == null)
                operation.parameters = new List<Parameter>();

            operation.parameters.Add(new Parameter { name = "Authorization", @in = "header", description = "授权", required = false, type = "header" });

        }
    }


    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
    public partial class HiddenApiAttribute : Attribute { }
    public class HiddenApiFilter : IDocumentFilter
    {
        /// <summary> 
        /// 重写Apply方法,移除隐藏接口的生成 
        /// </summary> 
        /// <param name="swaggerDoc">swagger文档文件</param> 
        /// <param name="schemaRegistry"></param> 
        /// <param name="apiExplorer">api接口集合</param> 
        public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
        {
            foreach (ApiDescription apiDescription in apiExplorer.ApiDescriptions)
            {
                if (Enumerable.OfType<HiddenApiAttribute>(apiDescription.GetControllerAndActionAttributes<HiddenApiAttribute>()).Any())
                {
                    string key = "/" + apiDescription.RelativePath;
                    if (key.Contains("?"))
                    {
                        int idx = key.IndexOf("?", StringComparison.Ordinal);
                        key = key.Substring(0, idx);
                    }
                    swaggerDoc.paths.Remove(key);
                }
            }
        }
    }
}
View Code

@天才卧龙的博客

posted @ 2020-12-11 11:25  天才卧龙  阅读(707)  评论(0编辑  收藏  举报