SwaggerUI为Asp.net Core提供JWT支持?

Sle*_*mer 0 c# jwt swagger-ui asp.net-core

我编写了一个Asp.Net核心REST服务,并获得了一些基本的JWT支持.如何让swagger测试页面发送BEARER令牌?

有点讨厌必须使用Fiddler发送请求.击败Swagger的全部意义.

Dan*_*aan 5

在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的实现.