gpt4 book ai didi

c# - ASP Net Core 2.2 仅向需要授权的方法添加储物柜图标 - Swagger UI

转载 作者:行者123 更新时间:2023-12-01 22:59:58 25 4
gpt4 key购买 nike

版本:

  • ASP Net Core Web API - 2.2
  • Swashbuckle.AspNetCore - 4.0.1
<小时/>

我目前拥有什么?

我已经在我的 Web API 项目中实现了 swagger。我在需要它的方法上使用带有 [Authorize] 属性的 JWT 授权。

所以我想要一种简单的方法来发送需要授权的请求。在我的 ConfigureServices 类中,我添加了以下逻辑。

services.AddSwaggerGen(c =>
{

// Other swagger options

c.AddSecurityDefinition("Bearer", new ApiKeyScheme
{
In = "header",
Description = "Please enter into field the word 'Bearer' following by space and your JWT token",
Name = "Authorization",
Type = "apiKey"
});
c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>>
{
{ "Bearer", Enumerable.Empty<string>() },
});

// Other swagger options
});

其作用如下:
它在 swagger 中添加了一个新按钮 - 授权。

enter image description here

问题是,它还在每个方法旁边添加了一个“打开”储物柜图标。尽管如此,其中一些需要授权。

enter image description here

当我使用授权按钮成功授权时(它基本上为每个请求添加了 header 授权),我在所有请求上收到一个“关闭”的储物柜。 enter image description here

我知道这可能是所需的功能,用于指示将通过请求发送授权 token 。我想要一种方法来显示哪些方法需要授权,哪些不需要。

我想要什么?

例如,匿名方法的“打开”储物柜和具有[Authorize]属性的方法的“关闭”储物柜。

它可能是一个附加图标,位于其旁边或修改该图标的行为,没问题。我怎样才能实现这个目标?

可能的解决方案?

我相信一个可能的解决方案是创建一个OperationFilter并遍历所有方法并将“某些内容”仅附加到那些具有[Authorize]属性的方法。这是最好的解决方案吗?如果是这样,您将如何实现?

最佳答案

距离我问这个问题已经过去一个多月了。我是这样做的。

我从 Startup.cs 中删除了以下代码:

c.AddSecurityDefinition("Bearer", new ApiKeyScheme
{
In = "header",
Description = "Please enter into field the word 'Bearer' following by space and your JWT token",
Name = "Authorization",
Type = "apiKey"
});
c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>>
{
{ "Bearer", Enumerable.Empty<string>() },
});

我添加了以下内容:

c.OperationFilter<AddAuthHeaderOperationFilter>();

当然还有AddAuthHeaderOperationFilter.cs:

    public class AddAuthHeaderOperationFilter : IOperationFilter
{
private readonly IHttpContextAccessor httpContextAccessor;

public AddAuthHeaderOperationFilter(IHttpContextAccessor httpContextAccessor)
{
this.httpContextAccessor = httpContextAccessor;
}

public void Apply(Operation operation, OperationFilterContext context)
{
var filterDescriptor = context.ApiDescription.ActionDescriptor.FilterDescriptors;
var isAuthorized = filterDescriptor.Select(filterInfo => filterInfo.Filter).Any(filter => filter is AuthorizeFilter);
var allowAnonymous = filterDescriptor.Select(filterInfo => filterInfo.Filter).Any(filter => filter is IAllowAnonymousFilter);

if (isAuthorized && !allowAnonymous)
{
if (operation.Parameters == null)
operation.Parameters = new List<IParameter>();

operation.Parameters.Add(new NonBodyParameter
{
Name = "Authorization",
In = "header",
Description = "JWT access token",
Required = true,
Type = "string",
//Default = $"Bearer {token}"
});

operation.Responses.Add("401", new Response { Description = "Unauthorized" });
operation.Responses.Add("403", new Response { Description = "Forbidden" });

operation.Security = new List<IDictionary<string, IEnumerable<string>>>();

//Add JWT bearer type
operation.Security.Add(new Dictionary<string, IEnumerable<string>>
{
{ "Bearer", new string[] { } }
});
}
}
}

简而言之,此OperationFilter 类仅将储物柜图标添加到需要授权的方法。不过储物柜总是打开的。所以这不是完美的解决方案,但目前还可以。

它的外观如下:

enter image description here

注意:所以如果你想测试 API,你首先要获取一个 token ,然后在需要的地方填写它。

关于c# - ASP Net Core 2.2 仅向需要授权的方法添加储物柜图标 - Swagger UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57371528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com