首页 文章

在Swashbuckle中启用持票人令牌(Swagger文档)

提问于
浏览
27

我创建了一个使用 Individual Account Security 的asp.net webapi应用程序,以便默认启用Bearer令牌 . 它工作正常,所以我能够在Postman中测试它们没有问题 .

当我尝试通过Swashbuckle集成Swagger UI时,问题就出现了 . 我通过以下方式安装了Swashbuckle:

Install-Package Swashbuckle

然后更改 SwaggerConfig.cs

GlobalConfiguration.Configuration
    .EnableSwagger(c =>
    {
        c.ApiKey("Token")
            .Description("Filling bearer token here")
            .Name("Authorization")
            .In("header");
    }
    .EnableSwaggerUi(c =>
    {
        c.EnableApiKeySupport("Authorization", "header");
    };

启动我的应用程序并填写Bearer令牌:

enter image description here

但是当我运行需要授权的api请求时,它不起作用 . 这是截图:

enter image description here

承载令牌添加到标头中的 Authorization . 但我仍然得到错误401.我'm wondering if it'因为令牌被编码(SPACE被%20取代)?任何的想法?谢谢 .

顺便说一句,我想知道如何在我的Swagger文档中添加 /token ,以便我可以在Swagger UI中获取令牌 .

2 回答

  • 17

    更新

    下面详述的问题现在已在Swashbuckle v5.5.0中解决 .

    问题

    刚遇到完全相同的问题 . 我认为根本原因是Swashbuckle's source code中的这一行:

    var key = encodeURIComponent($('#input_apiKey')[0].value);
    

    这是HTML输入字段的值通过URL编码将空格转换为 %20 的位置 . 我打算在Swashbuckle repo on GitHub中打开一个问题 .

    解决方法

    在该问题得到解决之前,这里有一个解决方法,它基于使用注入Swagger UI的Javascript文件替换上面的行:

    • 在安装了Swashbuckle的项目中,创建一个新文件夹并将其命名为"Swagger" .

    • 在新文件夹中创建一个名为"SwaggerUiCustomization.js"的新Javascript文件并将此脚本放入其中:

    (function () {
        function addApiKeyAuthorization() {
            var key = $('#input_apiKey')[0].value;
            if (key && key.trim() != "") {
                var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization(swashbuckleConfig.apiKeyName, key, swashbuckleConfig.apiKeyIn);
                window.swaggerUi.api.clientAuthorizations.add("api_key", apiKeyAuth);
                log("added key " + key);
            }
        }
        $('#input_apiKey').change(addApiKeyAuthorization);
    })();
    
    • 在解决方案资源管理器中,选择文件并按Alt Enter编辑其属性 . 在“属性”窗口中,将文件的“构建操作”更改为“嵌入式资源” .

    • 在SwaggerConfig.cs文件中,在 EnableSwaggerUi() 代码块中添加以下行: c.InjectJavaScript(thisAssembly, "<Project_Default_Namespace>.Swagger.SwaggerUiCustomization.js");
      当然,请确保将 <Project_Default_Namespace> 替换为项目的默认命名空间 .

    • 运行项目并在文本框中输入"Bearer " . 当您调用控制器操作时,您应该在服务器端获得完全相同的值 - 使用空格而不是 %20% .

  • 0

    注意:此示例使用Json Web Tokens .

    您的代码可以设置,因此授权字符串中不需要“Bearer” .

    WebApi项目中的代码检索令牌(请参阅下面代码段中的 token = ... ):

    private static bool TryRetrieveToken(HttpRequestMessage request, out string token)
        {
            token = null;
            IEnumerable<string> authzHeaders;
            if (!request.Headers.TryGetValues("Authorization", out authzHeaders) || authzHeaders.Count() > 1)
            {
                return false;
            }
            var bearerToken = authzHeaders.ElementAt(0);
            token = bearerToken.StartsWith("Bearer ") ? bearerToken.Substring(7) : bearerToken;
            return true;
        }
    

    Swagger ApiKey:

    c.ApiKey("Authorization")
                            .Description("Filling bearer token here")
                            .Name("Bearer")
                            .In("header");
    

    Swagger启用ApiKey支持:

    c.EnableApiKeySupport("Authorization", "header");
    

    将标记粘贴到Swagger UI中的Api_Key表单元素中:
    enter image description here

    它在Swagger中的请求标头中的显示方式:
    enter image description here

相关问题