[第二篇]如何在ASP.Net Core的生产环境中使用OAuth保护swagger ui

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[第二篇]如何在ASP.Net Core的生产环境中使用OAuth保护swagger ui相关的知识,希望对你有一定的参考价值。

在我上篇文章如何在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

以上是关于[第二篇]如何在ASP.Net Core的生产环境中使用OAuth保护swagger ui的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

如何在 ASP.NET Core 3.1 生产中配置 IdentityServer

结合Jexus + Kestrel 部署 asp.net core 生产环境

总结:利用asp.net core日志进行生产环境下的错误排查(asp.net core version 2.2,用IIS做服务器)