首页 > 其他分享 >.net core 关于对swagger的UI(Index.html)或接口的权限验证;

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

时间:2023-03-23 18:23:21浏览次数:43  
标签:core Index app next html context using swagger public

背景:

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

标签:core,Index,app,next,html,context,using,swagger,public
From: https://www.cnblogs.com/BFMC/p/17248307.html

相关文章

  • 28、服务发现-CoreDNS、会话粘滞、无头服务
    1、基础知识1.1、需求在传统的系统部署中,服务运行在一个固定的已知的IP和端口上,如果一个服务需要调用另外一个服务,可以通过地址直接调用,但是,在虚拟化或容器话的环境......
  • Asp.net Core 全局异常处理
    中间件方式建立中间件处理类Startup.cs中注册任何Controller中的Action抛出异常均可被捕捉在项目根目录下自建目录Middleware新建中间件类ErrorHandlerMiddleware......
  • HTML请求错误代码
    HTML请求错误代码 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态码。 100(继续)请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分......
  • 200行代码,7个对象——让你了解ASP.NET Core框架的本质
    200行代码,7个对象——让你了解ASP.NETCore框架的本质原文还有源码下载和pdf格式的ppt下载。Toinstallmissingframework,download:https://aka.ms/dotnet-core-appla......
  • ASP.NET Core Web API 接口限流
    一.前言ASP.NETCoreWebAPI接口限流、限制接口并发数量,我也不知道自己写的有没有问题,抛砖引玉、欢迎来喷!二.需求写了一个接口,参数可以传多个人员,也可以传单个人员,时间......
  • HTML——select标签
    select标签下拉框标签双闭合标签<selectname="cla_name"id="">{%foriincla_all%}<optionvalue="{{i.pk}}">{{i.cla_name}}</option>{......
  • ASP.NET Core - 选项系统之选项使用
    上一篇ASP.NETCore-选项系统之选项配置中提到IOptions、IOptionsMonitor和IOptionsSnapshot三个接口,通过这三个接口都可以从依赖注入容器中解析出已经配置的选项......
  • 349套HTML5+CSS3各行各业网站模板免费下载
    场景349套HTML5+CSS3各行各业网站模板。Web前端开发是从网页制作演变而来的,名称上有很明显的时代特征。在互联网的演化进程中,网页制作是Web1.0时代产物,那时网站的主要内容是......
  • HTML5中的服务器发送事件Server-sent events
    HTML5加了许多新功能,其中服务器发送事件Server-sentevents是一个亮点,以下直接贴上代码示例 客户端a.html页面<!DOCTYPEhtml><html><head><metacharset......
  • HTML5中使用SpeechSynthesisAPI实现语音合成
    场景在网页端实现将指定的文字进行语音合成并进行播报。使用HTML5的SpeechSynthesisAPI就能实现简单的语音合成效果。注:关注公众号霸道的程序猿获取编程相关电子书、教......