背景: 如何在ASP.Net Core的生產環境中保護swagger ui,也就是index.html頁面。其實swagger是自帶禁用的功能的,只需要設置開關即可。但是有一些場景,是需要把這些介面進行開放或者導出成文檔供第三方進行調用,這個時候卻又不想讓所有人訪問。本文介紹一種許可權控制訪問的方式, ...
背景:
如何在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非常方便我們後端開發人員調試介面或者測試使用,但是還是需要做好安全的處理。避免不必要的暴漏介面或參數。感謝觀看~
從前慢,車馬慢。 一生只愛一個人。