SAMXIE 2020-02-19
进入正题
我把我用到的所有代码黏贴出来:一个个的说:
Swagger 注册:
services.AddSwaggerGen(c => { c.OperationFilter<HttpAuthHeaderFilter>(); var security = new Dictionary<string, IEnumerable<string>> { { "Bearer", new string[] { } }, }; c.AddSecurityRequirement(security); //添加一个必须的全局安全信息 //,和AddSecurityDefinition方法指定的方案名称要一致, //这里是Bearer。 c.DescribeStringEnumsInCamelCase(); c.DescribeAllParametersInCamelCase(); c.DescribeAllEnumsAsStrings(); c.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info { Title = "接口文档", Version = "v1", Description = "YiSpace LazyCoder is Make", }); string[] files = Directory.GetFiles(AppContext.BaseDirectory, "*.xml"); // var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; // var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); foreach (var item in files) { c.IncludeXmlComments(item, true); } //var xmlPath = Path.Combine(AppContext.BaseDirectory, ""); //c.IncludeXmlComments(xmlPath); //var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); //c.IncludeXmlComments(xmlPath); // c.IgnoreObsoleteActions(); c.AddSecurityDefinition("Bearer", new ApiKeyScheme { Description = "权限认证(数据将在请求头中进行传输) 参数结构: \"Authorization: Bearer {token}\"", Name = "Authorization",//jwt默认的参数名称 In = "header",//jwt默认存放Authorization信息的位置(请求头中) Type = "apiKey" });//Authorization的设置 }); ? c.OperationFilter<HttpAuthHeaderFilter>(); 这只是一个自定义个 Paramater 的过滤器.用户为哦通用添加 信息,为特定Filter 添加信息用 ? var security = new Dictionary<string, IEnumerable<string>> { { "Bearer", new string[] { } }, }; c.AddSecurityRequirement(security); //,和AddSecurityDefinition方法指定的方案名称要一致, //这里是Bearer。这也是我们之后看见的, Authore.Lock 的原因.因为 我们是开发的API 有些必须要有 认证所以我就添加了全局的注册. ? 一下这些 就是类型转化的配置 c.DescribeStringEnumsInCamelCase(); c.DescribeAllParametersInCamelCase(); c.DescribeAllEnumsAsStrings(); ? 中间的就不用说了Asp.net Core 官网上都有 ? c.AddSecurityDefinition("Bearer", new ApiKeyScheme { Description = "权限认证(数据将在请求头中进行传输) 参数结构: \"Authorization: Bearer {token}\"", Name = "Authorization",//jwt默认的参数名称 In = "header",//jwt默认存放Authorization信息的位置(请求头中) Type = "apiKey" });//Authorization的设置 这是核心的因为有了他才会有可定制的 UI 否者不会有我们先看到. ? 同时我个人还没有就为单个api 添加 Token 开关. 也不不知如何添加 这样我们的东西可以用了但是要注意 这里用是 jwt Bearer 他提交时是没有给你添加Bearer 所以在使用时 Authorization: Bearer {token} 需要自己加上 Bearer 延续 看了一下代码,突来了点灵感 实现了一下单个Action 的 token 认证 这个我们需要用到. IOperationFilter /// <summary> /// swagger 增加 AUTH 选项 /// </summary> public class HttpAuthHeaderFilter : IOperationFilter { public void Apply(Operation operation, OperationFilterContext context) { var HasAuth = context.ApiDescription.ActionDescriptor.FilterDescriptors.Any(t => t.Filter is Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter); if (HasAuth) { //operation.Security =new var security = new Dictionary<string, IEnumerable<string>> { { "Bearer", new string[] { } }, }; var ls = new List<IDictionary<string, IEnumerable<string>>>(); ls.Add(security); operation.Security = ls; } } } operation.Security = ls; 就是安全认证的信息 配置,我没找到 api doc ,
有了他
我们还要把 :
c.AddSecurityRequirement(security);
注释了,因为他时注册全局的 身份认账.
其他的就不用做修改了, 这里我比较懒 和和代码的容易理解 没有 把配置信息 list 防止到全局,但也没有大问题,毕竟用一次.