Sle*_*mer 0 c# jwt swagger-ui asp.net-core
我编写了一个Asp.Net核心REST服务,并获得了一些基本的JWT支持.如何让swagger测试页面发送BEARER令牌?
有点讨厌必须使用Fiddler发送请求.击败Swagger的全部意义.
在ConfigureSwaggerDocument()扩展方法中,您可以将SecurityDefinitions添加到SwaggerDocumentOptions.例:
options.SecurityDefinitions.Add("yourapi_oauth2", new OAuth2Scheme()
{
Description = "OAuth2 client credentials flow",
Type = "oauth2",
Flow = "clientcredentials",
AuthorizationUrl = Configuration["OpenId:authority"],
TokenUrl = Configuration["OpenId:authority"] + "/connect/token",
Scopes = new Dictionary<string, string>() { { "yourapi", "your api resources"} }
} );
options.OperationFilter<ApplyOAuth2Security>();
options.DocumentFilter<ApplyOAuth2Security>();
Run Code Online (Sandbox Code Playgroud)
ApplyOAuth2Security是一个自定义类,它实现了IDocumentFilter和IOperationFilter,用于告诉配置Swagger使用您的授权方式.示例续:
public class ApplyOAuth2Security : IDocumentFilter, IOperationFilter
{
public void Apply(Operation operation, OperationFilterContext context)
{
var filterPipeline = context.ApiDescription.ActionDescriptor.FilterDescriptors;
var isAuthorized = filterPipeline.Select(f => f.Filter).Any(f => f is AuthorizeFilter);
var authorizationRequired = context.ApiDescription.GetControllerAttributes().Any(a => a is AuthorizeAttribute);
if (!authorizationRequired) authorizationRequired = context.ApiDescription.GetActionAttributes().Any(a => a is AuthorizeAttribute);
if (isAuthorized && authorizationRequired)
{
operation.Parameters.Add(new NonBodyParameter()
{
Name = "Authorization",
In = "header",
Description = "JWT security token obtained from Identity Server.",
Required = true,
Type = "string"
});
}
}
public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
{
IList<IDictionary<string, IEnumerable<string>>> security = swaggerDoc.SecurityDefinitions.Select(securityDefinition => new Dictionary<string, IEnumerable<string>>
{
{securityDefinition.Key, new string[] {"yourapi"}}
}).Cast<IDictionary<string, IEnumerable<string>>>().ToList();
swaggerDoc.Security = security;
}
}
Run Code Online (Sandbox Code Playgroud)
看起来像这样的swagger-ui:
请记住,您需要完全根据自己的需要调整IDocumentFiler和IOperationFilter的实现.