tnblog
首页
视频
资源
登录

.net core 3.1 Identity Server4 (Swagger UI授权)

7741人阅读 2021/1/25 16:48 总访问:3657030 评论:0 收藏:0 手机
分类: Ids4

.net core 3.1 Identity Server4 (Swagger UI授权)

前言

Swagger是一个有用的工具,用于使用标准JSON格式即时创建基本的API文档,该文档可以使用对开发人员友好的UI进行呈现。这些UI通常允许您开始通过浏览器发出演示请求。但是,一旦您开始使用OAuth保护此API,该如何保持Swagger文档的功能?

Swagger与OAuth授权服务器的集成已有相对完善的文档,因此在本文中,您将了解使用Swagger将IdentityServer支持添加到ASP.NET Core API的基础,然后了解这种方法的局限性以及也许值得探索。

本文将演示Swashbuckle。

准备API

首先,您需要使用IdentityServer保护的API。这里我们就创建一个ApIDemo2的API。在ConfigureServices中注册身份验证。

  1. services.AddAuthentication("Bearer")
  2. .AddJwtBearer("Bearer", options =>
  3. {
  4. options.Authority = "https://localhost:7200"; // 授权服务器地址
  5. //确定自己是哪个资源(资源名称)
  6. options.Audience = "ApiTwo";
  7. options.RequireHttpsMetadata = false; // 是否使用https进行通信
  8. //取消验证用户以及验证角色
  9. options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
  10. {
  11. ValidateIssuer = false,
  12. ValidateAudience = false
  13. };
  14. });

tn然后通过更新Configure方法使其类似于以下内容,在HTTP管道中启用它:

  1. app.UseAuthentication();
  2. app.UseAuthorization();

然后,您可以通过使用AuthorizeAttribute动作或控制器来触发此操作。现在,您应该从这些受保护的端点获取401未经授权。这里我们在默认的WeatherForecastController下添加一个POST请求方法并添加授权标签Authorize

  1. [Authorize]
  2. [HttpPost]
  3. public IEnumerable<WeatherForecast> Post()
  4. {
  5. var rng = new Random();
  6. return Enumerable.Range(1, 5).Select(index => new WeatherForecast
  7. {
  8. Date = DateTime.Now.AddDays(index),
  9. TemperatureC = rng.Next(-20, 55),
  10. Summary = Summaries[rng.Next(Summaries.Length)]
  11. })
  12. .ToArray();
  13. }

IdentityServer授权服务器配置

GetApiResources方法中添加ApiScope。通过这种方法,你仅使用一个scope就能表示完全访问这个作用域的权限。

  1. new ApiScope("ApiTwo", "Full access to API #1")

要将Swagger UI配置为IdentityServer实现中的客户端应用程序(Client),您需要在IdentityServer中添加一个类似于以下内容的客户端条目。您正在使用授权码流PKCE和路径为的重定向URI /oauth2-redirect.html,这是Swagger UI的默认路径。如果您的Swagger UI具有基本路径,则还应将其包含在重定向URI中(即,如果Swagger UI处于/swagger,则重定向URI应该为/swagger/oauth2-redirect.html)。

  1. new Client
  2. {
  3. ClientId = "apidemo2_swagger",
  4. ClientName = "Swagger UI for ApIDemo2",
  5. ClientSecrets = {new Secret("secret".Sha256())}, // 这个自己整吧
  6. AllowedGrantTypes = GrantTypes.Code,
  7. // 启动Pkce
  8. RequirePkce = true,
  9. RequireClientSecret = false,
  10. RedirectUris = {"http://localhost:9001/swagger/oauth2-redirect.html"},
  11. AllowedCorsOrigins = {"http://localhost:9001"},
  12. AllowedScopes = { "ApiTwo" }
  13. },

Swashbuckle添加OAuth支持

回到我们的ApIDemo2中,让我们引入Swashbuckle

  1. Install-Package Swashbuckle -Version 5.6.0
  2. Install-Package Swashbuckle.AspNetCore.Swagger -Version 5.6.3

我们在ConfigureServices方法中添加以下内容进行注册,使用一些描述性信息配置基本的Swagger文档。

  1. services.AddSwaggerGen(options =>
  2. {
  3. options.SwaggerDoc("v1", new OpenApiInfo { Title = "Protected API", Version = "v1" });
  4. // 我们会在这下面添加更多东西...
  5. });

接下来,您想将有关授权服务器的一些信息添加到swagger文档中。由于您的UI将在最终用户的浏览器中运行,并且在该浏览器中运行的JavaScript将需要访问令牌,因此您将使用授权代码流(code的授权方式)(PKCE))。

同时您需要告诉Swashbuckle授权和令牌端点的位置(请检查IdentityServer4文档),以及它将使用的作用域(其中键是作用域本身,而值是显示名称) )。

  1. services.AddSwaggerGen(options =>
  2. {
  3. options.SwaggerDoc("v1", new OpenApiInfo { Title = "Protected API", Version = "v1" });
  4. options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
  5. {
  6. Type = SecuritySchemeType.OAuth2,
  7. Flows = new OpenApiOAuthFlows
  8. {
  9. AuthorizationCode = new OpenApiOAuthFlow
  10. {
  11. AuthorizationUrl = new Uri("https://localhost:7200/connect/authorize"),
  12. TokenUrl = new Uri("https://localhost:7200/connect/token"),
  13. Scopes = new Dictionary<string, string>
  14. {
  15. {"ApiTwo", "Swagger UI for ApIDemo2"}
  16. }
  17. }
  18. }
  19. });
  20. options.OperationFilter<AuthorizeCheckOperationFilter>();
  21. });

现在,您需要告诉您的庞大文档,哪些端点需要访问令牌才能工作,并且它们可以返回401403响应。您可以使用来执行此操作IOperationFilter,您可以在下面看到(已从EShopOnContainers示例存储库中的过滤器改编而成)。

  1. public class AuthorizeCheckOperationFilter : IOperationFilter
  2. {
  3. public void Apply(OpenApiOperation operation, OperationFilterContext context)
  4. {
  5. var hasAuthorize = context.MethodInfo.DeclaringType.GetCustomAttributes(true).OfType<AuthorizeAttribute>().Any()
  6. || context.MethodInfo.GetCustomAttributes(true).OfType<AuthorizeAttribute>().Any();
  7. if (hasAuthorize)
  8. {
  9. operation.Responses.Add("401", new OpenApiResponse { Description = "Unauthorized" });
  10. operation.Responses.Add("403", new OpenApiResponse { Description = "Forbidden" });
  11. operation.Security = new List<OpenApiSecurityRequirement>
  12. {
  13. new OpenApiSecurityRequirement
  14. {
  15. [
  16. new OpenApiSecurityScheme {Reference = new OpenApiReference
  17. {
  18. Type = ReferenceType.SecurityScheme,
  19. Id = "oauth2"}
  20. }
  21. ] = new[] { "ApiTwo" }
  22. }
  23. };
  24. }
  25. }
  26. }

然后,您可以像这样注册:

  1. options.OperationFilter<AuthorizeCheckOperationFilter>();

现在,您可以通过在Configure方法中添加以下内容,在管道中同时配置Swagger文档端点Swagger UI

  1. app.UseSwagger();
  2. app.UseSwaggerUI(options =>
  3. {
  4. options.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
  5. options.OAuthClientId("apidemo2_swagger");
  6. options.OAuthAppName("Demo API - Swagger");
  7. options.OAuthUsePkce();
  8. });

运行测试





其他

某网友表示还可以通过不同的方式进行扩展,比如通过Password,像下面几幅图那样


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Sqlerver添加用户与授权

添加用户安全性--&gt;登录名,然后右键新建登录名就可以了然后填写好相关信息就可以了右键属性,用户映射可以选择该用户可...

ASP.net core 认证与授权 OAuth 与 OpenID Connect

OAuth 2.0在介绍OAuth之前,我们先简单介绍一下OpenID。OpenID 是一个以用户为中心的数字身份识别框架,它具有开放、分散性...

identity server4 的授权模式

授权模式OAuth2.0 定义了四种授权模式:Implicit:简化模式;直接通过浏览器的链接跳转申请令牌。Client Credentials:客户...

identity server4 四种授权模式

爱情哪有那么复杂,能让你开开心心笑得最甜的那个人就是对的人下面介绍4种模式安全性从低到高客户端模式客户端模式只对客户...

IdentityServer4实现OAuth2.0四种模式之授权码模式

授权码模式隐藏码模式最大不同是授权码模式不直接返回token,而是先返回一个授权码,然后再根据这个授权码去请求token。这...

asp.net权限过滤器授权过滤器

asp.net权限过滤器其实和普通的过滤器差不多,只是它可以配合特性:AllowAnonymous来实现对这个过滤器的忽略。 具体做法就...

.net core 3.1 Identity Server4 (NSwag Api授权)

.net core 3.1 Identity Server4 (NSwag Api授权)[TOC] 创建ApiDemo3接口项目 引入NSwag库Install-Package NSwag.AspNetC...

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

.net core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...

net core中使用cookie

net core中可以使用传统的cookie也可以使用加密的cookieNET CORE中使用传统cookie设置:HttpContext.Response.Cookies.Appe...
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术