翼度科技»论坛 编程开发 .net 查看内容

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

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
背景:

如何在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方法添加以下代码:
  1.         public void ConfigureServices(IServiceCollection services)
  2.         {
  3.             if (services == null)
  4.                 throw new ArgumentNullException(nameof(services));
  5.             services.AddControllers();
  6.             // 添加Swagger
  7.             services.AddSwaggerGen(c =>
  8.             {
  9.                 c.SwaggerDoc("v1", new OpenApiInfo { Title = "API Demo", Version = "v1" });
  10.             });
  11.         }
复制代码
3,在startup.cs的Configure方法添加以下代码:        
  1.         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2.         {
  3.             if (env.IsDevelopment())
  4.             {
  5.                 app.UseDeveloperExceptionPage();
  6.             }
  7.             
  8.             app.UseAuthentication();
  9.             //等后续代码写好,取消此注释
  10.             //app.UseSwaggerAuthorized();//此代码就是验证代码
  11.             // 添加Swagger有关中间件
  12.             app.UseSwagger();
  13.             app.UseSwaggerUI(c =>
  14.             {
  15.                 c.SwaggerEndpoint("/swagger/v1/swagger.json", "API Demo v1");
  16.             });
  17.             app.UseStaticFiles();
  18.             app.UseCookiePolicy();
  19.             app.UseRouting();
  20.             app.UseAuthorization();
  21.             app.UseEndpoints(endpoints =>
  22.             {
  23.                 endpoints.MapControllers();
  24.             });
  25.         }
复制代码
4,到这为止就可以正常请求地址进行访问swagger了

 
 
 
二,增加对swagger ui的验证;

接下来我们增加访问验证
1,自己创建个文件夹新增ExpandAuction.cs文件,代码如下:
  1. using Microsoft.AspNetCore.Builder;
  2. namespace CoreApi.Until
  3. {
  4.     public static  class ExpandAuction
  5.     {
  6.         public static IApplicationBuilder UseSwaggerAuthorized(this IApplicationBuilder builder)
  7.         {
  8.             return builder.UseMiddleware<SwaggerBasicAuthMiddleware>();
  9.         }
  10.     }
  11. }
复制代码
2,创建SwaggerBasicAuthMiddleware.cs文件,代码如下:
  1. using Microsoft.AspNetCore.Http;
  2. using System;
  3. using System.Net;
  4. using System.Net.Http.Headers;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace CoreApi.Until
  8. {
  9.     public class SwaggerBasicAuthMiddleware
  10.     {
  11.         private readonly RequestDelegate next;
  12.         public SwaggerBasicAuthMiddleware(RequestDelegate next)
  13.         {
  14.             this.next = next;
  15.         }
  16.         public async Task InvokeAsync(HttpContext context)
  17.         {
  18.             if (context.Request.Path.StartsWithSegments("/swagger"))
  19.             {
  20.                 string authHeader = context.Request.Headers["Authorization"];
  21.                 if (authHeader != null && authHeader.StartsWith("Basic "))
  22.                 {
  23.                     // Get the credentials from request header
  24.                     var header = AuthenticationHeaderValue.Parse(authHeader);
  25.                     var inBytes = Convert.FromBase64String(header.Parameter);
  26.                     var credentials = Encoding.UTF8.GetString(inBytes).Split(':');
  27.                     var username = credentials[0];
  28.                     var password = credentials[1];
  29.                     // validate credentials
  30.                     if (username.Equals("swagger")
  31.                       && password.Equals("swagger"))
  32.                     {
  33.                         await next.Invoke(context).ConfigureAwait(false);
  34.                         return;
  35.                     }
  36.                 }
  37.                 context.Response.Headers["WWW-Authenticate"] = "Basic";
  38.                 context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
  39.             }
  40.             else
  41.             {
  42.                 await next.Invoke(context).ConfigureAwait(false);
  43.             }
  44.         }
  45.     }
  46. }
复制代码
3,整体目录结构如图:

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

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

 
 
结语:

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

来源:https://www.cnblogs.com/BFMC/archive/2023/03/23/17248307.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具