[第二篇]如何在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 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相关推荐
- NET问答: 如何在 ASP.NET Core 的 .json 文件中读取 AppSettings ?
咨询区 Oluwafemi: 在 appsettings.json 中我有如下的 AppSettings 实体数据,如下代码所示: {"AppSettings": {"t ...
- Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持
Jexus 是一款运行于 Linux 平台,以支持 ASP.NET.PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器.最新版 5.8.2 已经发布,有如下更新: 1,现在大 ...
- 如何在 ASP.NET Core 中实现全局异常拦截
异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理,我会用一些 样例代码 和 截图 来说明这些概 ...
- 如何在ASP.NET Core程序启动时运行异步任务(3)
原文:Running async tasks on app startup in ASP.NET Core (Part 3) 作者:Andrew Lock 译者:Lamond Lu 之前我写了两篇有关 ...
- 如何在ASP.NET Core程序启动时运行异步任务(2)
原文:Running async tasks on app startup in ASP.NET Core (Part 2) 作者:Andrew Lock 译者:Lamond Lu 在我的上一篇博客中 ...
- 获取异常信息_如何在 ASP.NET Core 中实现全局异常拦截
异常是一种运行时错误,当异常没有得到适当的处理,很可能会导致你的程序意外终止,这篇就来讨论一下如何在 ASP.Net Core MVC 中实现全局异常处理,我会用一些 样例代码 和 截图 来说明这些概 ...
- 如何在 ASP.NET Core 中使用 HttpClientFactory ?
ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. ...
- 如何在 ASP.Net Core 中使用 Autofac
依赖注入可以有效的实现对象之间的 松耦合 并能够实现代码的可测试和可维护性,ASP.Net Core 提供了一个极简版的容器实现对 依赖注入 的原生支持,然而内置的依赖注入容器相比成熟的 依赖注入容器 ...
- 如何在 ASP.NET Core 中使用 LazyCache
微软的 ASP.NET Core 已经是一个非常流行的用于构建 高性能, 模块化 并能运行在 Windows, Linux, MacOS 上的 WEB 框架,通常能够让程序保持高性能的一个有效途径就是 ...
最新文章
- 语言相关系数显著性_相关性分析在SPSS中的具体操作,一文读懂相关系数的含义及使用——【杏花开生物医药统计】...
- RunLoop的学习
- dann的alpha torch_一图解密AlphaZero(附Pytorch实践)
- 如何为SAP Cloud for Customer Lead页面配置自定义的Source字段
- 配置electron
- 硬件基础知识---(5)电阻的用法
- qregularexpression和qregexp的区别
- cad导出pdf_CAD手机看图软件中导出的CAD图纸为什么没有颜色?
- 联想ThinkPad E431禁用触摸板功能
- 保存书店每日交易记录程序设计
- FlashFXP用到的功能
- 华胜天成旗下成员企业沃趣科技为华泰证券IT系统保驾护航
- 【有利可图网】双十一“亮眼”设计大赏来了!!
- 【转】中国人要知道的76个常识
- Python男友日记 | 获取TaoBao上4000+条的口红数据,我发现了…
- 在window下使用 VScode 搭建 ARM 开发环境—— 详细版
- 双目立体视觉摄像头模块开发搭建,含源代码、电路图
- 统计基础(四)假设检验
- c语言如何让窗口无法关闭,无法关闭窗口的程序
- 途牛旅游项目-导航条(后端数据测试)
热门文章
- Class Diagram
- 关于tcmalloc\malloc和new
- thinkpaidE480office安装文件夹
- Leetcode400Nth Digit第N个数字
- (3)Python3笔记之变量与运算符
- 2016-2017-2学期《程序设计与数据结构》教学进程
- JCheckbox全选
- kdbchk: the amount of space used is not equal to block size
- java中List、Map、Set、Collection、Stack、Queue等的使用
- Android培训翻译_允许其他应用程序启动你的Activity