如何在ASP.Net Core的生产环境中保护swagger ui

2024-06-20 22:58

本文主要是介绍如何在ASP.Net Core的生产环境中保护swagger ui,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当您使用 dotnet 5 创建 WebApi 项目时,项目中会默认集成 swagger。

如下所示。

正如您在上面图片中看到的那样,开发人员仅在开发环境中很好地添加了swagger。所以你只能在开发模式下看到swagger页面。

但是,如果您想在生产环境中访问 swagger 页面,但同时又希望不是每个人都应该能够看到您的 api 端点,该怎么办呢?

在本教程中,我将阐述如何使用一些身份验证机制来保护生产环境中的 swagger 定义。

在下面的实例中,我将使用基本身份验证,所以让我们开始吧。

使用 Visual Studio 或 VScode 创建 一个webapi 项目。当然这里我使用的是vs2022,

让我们按 F5 运行 webapi,并导航到此 URL https://localhost:5001/swagger/index.html 来查看下swagger页面

现在添加一个名为 SwaggerBasicAuthMiddleware 的类并添加如下代码。

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 headervar 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 credentialsif (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);}}}

为简单起见,我使用的是硬编码凭据验证,但同样可以增强以从数据库中使用它。

像这样创建一个扩展方法。

public static IApplicationBuilder UseSwaggerAuthorized(this IApplicationBuilder builder)
{return builder.UseMiddleware<SwaggerBasicAuthMiddleware>();
}

从 env.IsDevelopment() 块中删除 swagger 部分并将其放在外面。在 startup.cs 中添加中间件,如下所示。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseAuthorization();
app.UseSwaggerAuthorized();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "SecureSwagger v1"));
...
}

确保在 UseSwagger() 和 UseSwaggerUI() 调用之前添加了 UseSwaggerAuthorized(),以便在访问 swagger ui 之前调用身份验证中间件。

有了这些代码更改,我们就可以运行我们的应用程序了。

按 F5 运行,您可以看到 swagger 页面正在加载,但浏览器正在询问凭据。

让我先尝试一些无效的凭据。我将分别使用“Test”和“Test”作为用户名和密码。

按下登录按钮后,它将验证凭据并在错误时返回同一页面。

如果按取消,它将显示 401 错误页面。

现在我将尝试使用有效的凭据。

可以看到swagger加载成功。

验证凭据后成功显示 Swagger 页面。

这篇关于如何在ASP.Net Core的生产环境中保护swagger ui的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079498

相关文章

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结