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

修改现有的扩展方法以使用 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相关推荐

  1. NET问答: 如何在 ASP.NET Core 的 .json 文件中读取 AppSettings ?

    咨询区 Oluwafemi: 在 appsettings.json 中我有如下的 AppSettings 实体数据,如下代码所示: {"AppSettings": {"t ...

  2. Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持

    Jexus 是一款运行于 Linux 平台,以支持  ASP.NET.PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器.最新版 5.8.2 已经发布,有如下更新: 1,现在大 ...

  3. 如何在 ASP.NET Core 中实现全局异常拦截

    异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理,我会用一些 样例代码 和 截图 来说明这些概 ...

  4. 如何在ASP.NET Core程序启动时运行异步任务(3)

    原文:Running async tasks on app startup in ASP.NET Core (Part 3) 作者:Andrew Lock 译者:Lamond Lu 之前我写了两篇有关 ...

  5. 如何在ASP.NET Core程序启动时运行异步任务(2)

    原文:Running async tasks on app startup in ASP.NET Core (Part 2) 作者:Andrew Lock 译者:Lamond Lu 在我的上一篇博客中 ...

  6. 获取异常信息_如何在 ASP.NET Core 中实现全局异常拦截

    异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理,我会用一些 样例代码 和 截图 来说明这些概 ...

  7. 如何在 ASP.NET Core 中使用 HttpClientFactory ?

    ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. ...

  8. 如何在 ASP.Net Core 中使用 Autofac

    依赖注入可以有效的实现对象之间的 松耦合 并能够实现代码的可测试和可维护性,ASP.Net Core 提供了一个极简版的容器实现对 依赖注入 的原生支持,然而内置的依赖注入容器相比成熟的 依赖注入容器 ...

  9. 如何在 ASP.NET Core 中使用 LazyCache

    微软的 ASP.NET Core 已经是一个非常流行的用于构建 高性能, 模块化 并能运行在 Windows, Linux, MacOS 上的 WEB 框架,通常能够让程序保持高性能的一个有效途径就是 ...

最新文章

  1. 语言相关系数显著性_相关性分析在SPSS中的具体操作,一文读懂相关系数的含义及使用——【杏花开生物医药统计】...
  2. RunLoop的学习
  3. dann的alpha torch_一图解密AlphaZero(附Pytorch实践)
  4. 如何为SAP Cloud for Customer Lead页面配置自定义的Source字段
  5. 配置electron
  6. 硬件基础知识---(5)电阻的用法
  7. qregularexpression和qregexp的区别
  8. cad导出pdf_CAD手机看图软件中导出的CAD图纸为什么没有颜色?
  9. 联想ThinkPad E431禁用触摸板功能
  10. 保存书店每日交易记录程序设计
  11. FlashFXP用到的功能
  12. 华胜天成旗下成员企业沃趣科技为华泰证券IT系统保驾护航
  13. 【有利可图网】双十一“亮眼”设计大赏来了!!
  14. 【转】中国人要知道的76个常识
  15. Python男友日记 | 获取TaoBao上4000+条的口红数据,我发现了…
  16. 在window下使用 VScode 搭建 ARM 开发环境—— 详细版
  17. 双目立体视觉摄像头模块开发搭建,含源代码、电路图
  18. 统计基础(四)假设检验
  19. c语言如何让窗口无法关闭,无法关闭窗口的程序
  20. 途牛旅游项目-导航条(后端数据测试)

热门文章

  1. Class Diagram
  2. 关于tcmalloc\malloc和new
  3. thinkpaidE480office安装文件夹
  4. Leetcode400Nth Digit第N个数字
  5. (3)Python3笔记之变量与运算符
  6. 2016-2017-2学期《程序设计与数据结构》教学进程
  7. JCheckbox全选
  8. kdbchk: the amount of space used is not equal to block size
  9. java中List、Map、Set、Collection、Stack、Queue等的使用
  10. Android培训翻译_允许其他应用程序启动你的Activity