[第二篇]如何在ASP.Net Core的生產環境中使用OAuth保護swagger ui

語言: CN / TW / HK

在我上篇文章 如何在ASP.Net Core的生產環境中保護swagger ui 中,我們討論瞭如何使用基本身份驗證來保護 swagger ui。

使用 OAuth 2.0 和 OpenIdConnect 進行保護

隨著應用程式越來越多地使用 OAuth 和 OpenIdConnect,應用程式很有可能使用 OAuth 和 OpenIDConnect 進行身份驗證和授權,在這種情況下,我們希望使用相同的機制來保護 swagger ui,而不是基本身份驗證。

在本教程中,我將探討如何使用 OAuth 和 OpenIDConnect 來保護 swagger ui。

讓我們首先對我們在上一篇文章中建立的現有解決方案進行更改。

新增一個名為 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 authenticated
      if (!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;
});

修改現有的擴充套件方法以使用 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();
...
}

身份提供者

我們需要一個身份提供者來測試我們的應用程式。我使用 KeyCloak 作為演示的身份提供者,但也可以使用任何其他身份提供者。作為資深.NET開發者,相信你程式碼中用的最多的是IdentityServer4.

我有本地執行的 docker 版本的 KeyCloak。點選連結瞭解更多關於 keycloak 如何作為 docker 容器在本地執行的資訊。

連結

演示

我在 KeyCloak中建立了一個名為“ demo ”的使用者。

有了所有這些更改,我們就可以執行我們的應用程式了。

按 F5 執行應用程式。

一旦應用程式啟動 swagger ui,它就會被重定向到登入頁面。

我們將使用新建立的使用者“ demo ”登入。成功登入後,它將重定向回 swagger ui。

KeyCloak 的登入頁面

登入成功後的 Swagger UI

基於角色的訪問

我們可以通過僅限制特定角色的使用者來進一步增強。

對於演示,我建立了一個名為“ devteam ”的角色並分配給我們的使用者“demo”。

在 KeyCloak 中添加了新角色

在 SwaggerOAuthMiddleware.cs 中新增以下程式碼

if (!context.User.HasClaim("role", "devteam"))
{
  await context.ChallengeAsync();
  return;
}

通過此更改,只有角色“ devteam ”的使用者才能訪問 swagger ui。

至此結束!

本文翻譯自:https://medium.com/@niteshsinghal85/securing-swagger-ui-in-production-in-asp-net-core-part-2-dc2ae0f03c73