[第二篇]如何在ASP.Net Core的生产环境中使用OAuth保护swagger ui
在我上篇文章如何在ASP.Net Core的生產(chǎn)環(huán)境中保護swagger ui中,我們討論了如何使用基本身份驗證來保護 swagger ui。
使用 OAuth 2.0 和 OpenIdConnect 進行保護
隨著應(yīng)用程序越來越多地使用 OAuth 和 OpenIdConnect,應(yīng)用程序很有可能使用 OAuth 和 OpenIDConnect 進行身份驗證和授權(quán),在這種情況下,我們希望使用相同的機制來保護 swagger ui,而不是基本身份驗證。
在本教程中,我將探討如何使用 OAuth 和 OpenIDConnect 來保護 swagger ui。
讓我們首先對我們在上一篇文章中創(chuàng)建的現(xiàn)有解決方案進行更改。
添加一個名為 SwaggerOAuthMiddleware的類并添加以下代碼
public class SwaggerOAuthMiddleware {private readonly RequestDelegate next;public SwaggerOAuthMiddleware(RequestDelegate next){this.next = next;}public async Task InvokeAsync(HttpContext context){if (IsSwaggerUI(context.Request.Path)){// if user is not authenticatedif (!context.User.Identity.IsAuthenticated){await context.ChallengeAsync();return;}}await next.Invoke(context);}public bool IsSwaggerUI(PathString pathString){return pathString.StartsWithSegments("/swagger");} }在 startup.cs 的 ConfigureServices 方法中添加以下代碼
services.Configure<CookiePolicyOptions>(options => {options.CheckConsentNeeded = context => true;options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddAuthentication(options => {options.DefaultScheme = "Cookies"options.DefaultChallengeScheme = "oidc"; }) .AddCookie("Cookies") .AddOpenIdConnect("oidc", options => {options.SignInScheme = "Cookies";options.Authority = Configuration["jwt:Authority"];options.ClientId = Configuration["jwt:Audience"];options.ResponseType = "code";options.Prompt = "login";options.GetClaimsFromUserInfoEndpoint = true;options.SaveTokens = true; });修改現(xiàn)有的擴展方法以使用 SwaggerOAuthMiddleware
public static IApplicationBuilder UseSwaggerAuthorized(this IApplicationBuilder builder) {return builder.UseMiddleware<SwaggerOAuthMiddleware>(); }修改配置方法如下
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { ... app.UseAuthentication(); app.UseSwaggerAuthorized(); app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "SecureSwagger v1")); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseRouting(); app.UseAuthorization(); ... }身份提供者
我們需要一個身份提供者來測試我們的應(yīng)用程序。我使用 KeyCloak 作為演示的身份提供者,但也可以使用任何其他身份提供者。作為資深.NET開發(fā)者,相信你代碼中用的最多的是IdentityServer4.
我有本地運行的 docker 版本的 KeyCloak。點擊鏈接了解更多關(guān)于 keycloak 如何作為 docker 容器在本地運行的信息。
鏈接
演示
我在 KeyCloak中創(chuàng)建了一個名為“ demo ”的用戶。
有了所有這些更改,我們就可以運行我們的應(yīng)用程序了。
按 F5 運行應(yīng)用程序。
一旦應(yīng)用程序啟動 swagger ui,它就會被重定向到登錄頁面。
我們將使用新創(chuàng)建的用戶“ demo ”登錄。成功登錄后,它將重定向回 swagger ui。
KeyCloak 的登錄頁面
登錄成功后的 Swagger UI
基于角色的訪問
我們可以通過僅限制特定角色的用戶來進一步增強。
對于演示,我創(chuàng)建了一個名為“ devteam ”的角色并分配給我們的用戶“demo”。
在 KeyCloak 中添加了新角色
在 SwaggerOAuthMiddleware.cs 中添加以下代碼
if (!context.User.HasClaim("role", "devteam")) {await context.ChallengeAsync();return; }通過此更改,只有角色“ devteam ”的用戶才能訪問 swagger ui。
至此結(jié)束!
本文翻譯自:https://medium.com/@niteshsinghal85/securing-swagger-ui-in-production-in-asp-net-core-part-2-dc2ae0f03c73
總結(jié)
以上是生活随笔為你收集整理的[第二篇]如何在ASP.Net Core的生产环境中使用OAuth保护swagger ui的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BeetleX实现MessagePack
- 下一篇: 读《底层逻辑》