.net core 关于对swagger的UI(Index.html)或接口的权限验证;

背景:

如何在ASP.Net Core的生产环境中保护swagger ui,也就是index.html页面。其实swagger是自带禁用的功能的,只需要设置开关即可。但是有一些场景,是需要把这些接口进行开放或者导出成文档供第三方进行调用,这个时候却又不想让所有人访问。本文介绍一种权限控制访问的方式,用来指定用户使用;

基本思路:

1,利用UseMiddlewareExtensions的UseMiddleware<>方法将中间件类型添加到应用程序的请求管道中。

2,增加异步方法用来验证请求的地址的header(不局限于Headers,或cookie或session)携带的信息进行比对。

3,根据比对结果返回重新登录或401或index.html页面。

实现:

一,.netcore 使用 swagger

1,在nuget包中安装Swashbuckle.AspNetCore

 2,在startup.cs的ConfigureServices方法添加以下代码:

        public void ConfigureServices(IServiceCollection services)
        {
            if (services == null)
                throw new ArgumentNullException(nameof(services));
            services.AddControllers();
            // 添加Swagger
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "API Demo", Version = "v1" });
            });
        }

3,在startup.cs的Configure方法添加以下代码:        

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            
            app.UseAuthentication();
            //等后续代码写好,取消此注释
            //app.UseSwaggerAuthorized();//此代码就是验证代码
            // 添加Swagger有关中间件
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "API Demo v1");
            });
            app.UseStaticFiles();
            app.UseCookiePolicy();


            app.UseRouting();


            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

4,到这为止就可以正常请求地址进行访问swagger了

二,增加对swagger ui的验证;

接下来我们增加访问验证

1,自己创建个文件夹新增ExpandAuction.cs文件,代码如下:

using Microsoft.AspNetCore.Builder;

namespace CoreApi.Until
{
    public static  class ExpandAuction
    {
        public static IApplicationBuilder UseSwaggerAuthorized(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<SwaggerBasicAuthMiddleware>();
        }
    }
}

2,创建SwaggerBasicAuthMiddleware.cs文件,代码如下:

using Microsoft.AspNetCore.Http;
using System;
using System.Net;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace CoreApi.Until
{
    public class SwaggerBasicAuthMiddleware
    {


        private readonly RequestDelegate next;

        public SwaggerBasicAuthMiddleware(RequestDelegate next)
        {
            this.next = next;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            if (context.Request.Path.StartsWithSegments("/swagger"))
            {
                string authHeader = context.Request.Headers["Authorization"];
                if (authHeader != null && authHeader.StartsWith("Basic "))
                {
                    // Get the credentials from request header
                    var header = AuthenticationHeaderValue.Parse(authHeader);
                    var inBytes = Convert.FromBase64String(header.Parameter);
                    var credentials = Encoding.UTF8.GetString(inBytes).Split(':');
                    var username = credentials[0];
                    var password = credentials[1];
                    // validate credentials
                    if (username.Equals("swagger")
                      && password.Equals("swagger"))
                    {
                        await next.Invoke(context).ConfigureAwait(false);
                        return;
                    }
                }
                context.Response.Headers["WWW-Authenticate"] = "Basic";
                context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            }
            else
            {
                await next.Invoke(context).ConfigureAwait(false);
            }
        }


    }

}

3,整体目录结构如图:

4,取消startup中的注释,如图

5,无身份的时候进行请求效果:

结语:

swagger非常方便我们后端开发人员调试接口或者测试使用,但是还是需要做好安全的处理。避免不必要的暴漏接口或参数。感谢观看~

0 条评论
请不要发布违法违规有害信息,如发现请及时举报或反馈
还没有人评论呢,速度抢占沙发!
相关文章
  • w3c机构:规定网页分成三个部分:结构、样式、表现形式。     无序列表: (每个列表左侧都有实心黑点,可以用css去掉)   列表1 列表2 快捷方式:...

  • 最近又是更新了报告模板的样式新使用了目录对象 因为直接生成的目录样式比较丑所以这边使用的是自定义xsl                                               ...

  • 获取元素的尺寸信息,有很多种方法。不同的尺寸属性有不同的定义,如果没有很好的总结,就很容易混淆。下面就一起来看看。偏移尺寸(offset)元素相对于偏移父元素(offsetParent)的偏移尺寸。o...

  • html篇之《标签分类和嵌套》 一、常用标签 (1) 一个区块容器标记,可以包含图片、表格、段落等各种html元素 (2) 没有实际意义,为了应用样式 二、标签分类 (1) 块级标签 独...

  • 💂 网站推荐:【神级源码资源网】【摸鱼小游戏】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬 免费且实用的计算机相关知识...

  • 💂 网站推荐:【神级源码资源网】【摸鱼小游戏】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬 免费且实用的计算机相关知识...

  • HTML HTML01:初识HTML HTML Hyper Text Markup Language(超文本语言) W3C World Wide Web Consortium...

  • 好家伙,好久好久没有更新这个系列了   为了使文档更方便阅读,使代码更容易维护,来把这个飞机大战模块化 项目已开源: https://gitee.com/tang-and-han-...

  • 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 HTML页面加载过程会发生什么?因为浏览器网络拉取资源是多线程的,但是dom树的操作都是在一个线程中的,所以网页资源的解析、js加载、...

  • 网络环境总是多样且复杂的,一张网页图片可能会因为网路状况差而加载失败或加载超长时间,也可能因为权限不足或者资源不存在而加载失败,这些都会导致用户体验变差,所以我们需要对图片加载失败时的情况进行一个弥补...

  • Markdown 利用HTML进行优雅排版 我在使用Markdown整理文档的时候发现,Markdown本身对文本格式的排版很单一,只有编号、字体加粗、固定标题格式等一些基础的排版,使用不够灵活,好...

  • 零、学习中的补充 1、head中的meta 这段代码表示2s后当前网页会自动refresh跳转到http://www.baidu.com页面。 一般来说,HTML中只有六个标签可以放在head中...

  • 一、HTML介绍 HTML是一种标记语言,不是编程语言,为了快速上手,其他的可以自己查询,下面是我使用VScode生成的第一个HTML网页。 二、HTML标签介绍 标签分为单标签和双标签, 换行:单...

  • 上篇: Bootstrap Blazor 实战 通用导入导出服务(Table组件) 1.新建工程 新建工程b14table dotnet new blazorserver -o b14table ...

  • 上篇文章我们一起学习了 Flowable 中的动态表单,动态表单说白了就是把变量打包定义,零存整取。但是小伙伴们可能很难实实在在 GET 到动态表单一些有创造性的功能,所以今天我们就来继续看看 Flo...

  • 近期于项目中发现微信小程序不能直接解析html富文本内容信息碾转多方,已寻得解决方案。话不多说,直接上货使用wxParsegit地址:https://github.com/icindy/wxP...把...

  • 渲染模板 我的客服系统后端使用的golang Gin 框架,想把页面渲染出来,下面就是加载html模板页面 package router func InitViewRouter(engine *gi...

  • 本博文介绍HTML中的表单标签。 表单 = 表单域 + 表单控件 + 提示信息,下面说说表单域和表单控件。 1 表单域标签:         基本格式:                        ...

  • 目标: 会使用HTML5的基本结构创建网页 会使用文本相关标签排版文本信息 会使用图像相关标签实现图文并茂的页面 会使用标签创建超链接、锚链接及功能性链接 1、什么是HTML HTML:Hyper...

  • 此内容包含: html基础 列表、表格 媒体元素 表单(重点) 1、HTML 基础 目标: 会使用HTML5的基本结构创建网页 会使用文本相关标签排版文本信息 会使用图像相关标签实现图文并茂的页...