2016-08-11 145 views
5

我在ASP.NET Web API上使用Swashbuckle和Swagger。我試圖找到一種方法來通過Swagger UI傳遞包含持票人令牌的授權標頭。我一直在四處搜尋,但所有的答案似乎指向this鏈接。Swagger UI:傳遞自定義授權標頭

但是,這假定標頭的內容是預先知道的。我真的需要一種方法來改變Swagger UI中的頭部(就在點擊'試試看!'按鈕之前),因爲持證者令牌每小時都會過期。類似於Postman允許您添加標題的方式。

這似乎是這樣一個可笑的簡單問題,但答案是什麼?

回答

13

我們碰到了我們的項目同樣的問題。我也想將標題參數添加到Swagger UI網站。這是我們如何做到的:

1。定義一個OperationFilter類 每次構建Swagger時,每個API操作都會執行OperationFilters。根據您的代碼,操作將根據您的過濾器進行檢查。在這個例子中,我們使每個操作都需要header參數,但是在具有AllowAnonymous屬性的操作中使其成爲可選參數。

public class AddAuthorizationHeader : IOperationFilter 
{ 
    /// <summary> 
    /// Adds an authorization header to the given operation in Swagger. 
    /// </summary> 
    /// <param name="operation">The Swashbuckle operation.</param> 
    /// <param name="schemaRegistry">The Swashbuckle schema registry.</param> 
    /// <param name="apiDescription">The Swashbuckle api description.</param> 
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) 
    { 
     if (operation == null) return; 

     if (operation.parameters == null) 
     { 
      operation.parameters = new List<Parameter>(); 
     } 

     var parameter = new Parameter 
     { 
      description = "The authorization token", 
      @in = "header", 
      name = "Authorization", 
      required = true, 
      type = "string" 
     }; 

     if (apiDescription.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any()) 
     { 
      parameter.required = false; 
     } 

     operation.parameters.Add(parameter); 
    } 
} 

2.告訴揚鞭使用此OperationFilter 在SwaggerConfig,只是添加了操作過濾器應使用如下:

c.OperationFilter<AddAuthorizationHeader>(); 

希望這可以幫助你!

+0

看來,最新版本的Swashbuckle改變了操作類來移除參數過濾器類?有什麼想法嗎? –

+0

如果我創建過濾器,我所有的操作都要求它?我如何排除控制器操作不需要它? –

1

您可以通過不同的方式來完成,具體取決於您收集標頭的方式,以及您希望代碼處理所有事情,還是希望用戶能夠輸入他們想要的標頭Authorization

當我第一次嘗試這樣做時,我能夠在每個端點的參數字段區域中顯示一個Authorization標題文本,用戶可以在其中輸入Authorization標題,但這不是我想要的。

在我的情況下,我不得不通過用戶的cookie向/token端點發送請求,以獲得有效的Authorization令牌。所以我做了一些事情來達到這個目的。

首先在SwaggerConfig.cs我註釋掉c.BasicAuth()得到基本身份驗證方案到API的模式,我也注入其中,我插在爲了搶Authorization令牌AJAX請求定製index.html頁面,使用用戶的Cookie(顯示index.html代碼如下圖):

public static void Register() { 

    System.Reflection.Assembly thisAssembly = typeof(SwaggerConfig).Assembly; 

    System.Web.Http.GlobalConfiguration.Configuration 
       .EnableSwagger(c => { 
        ... 

        c.BasicAuth("basic").Description("Bearer Token Authentication"); 

        ... 
       }) 
       .EnableSwaggerUi(c => { 
        ... 

        c.CustomAsset("index", thisAssembly, "YourNamespace.index.html"); 

        ... 
       }); 
} 

然後前往here下載swashbuckle index.html我們將定製插入一個Authorization頭。

下面我簡單做一個AJAX調用我/token端點有效的cookie,得到Authorization令牌,並給它招搖着window.swaggerUi.api.clientAuthorizations.add()使用:

我刪除了一些東西從AJAX打電話讓它更簡單,顯然你的實現可能會有所不同,這取決於你如何收集你的令牌和東西,但這給你一個想法。如果您有任何具體問題或疑問,請告訴我。

*編輯:沒有注意到你確實希望用戶輸入他們的Authorization標題。在這種情況下,這很容易。我用this後。簡單地創建了下面的類做的工作:

public class AddRequiredHeaderParameter : IOperationFilter { 

    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) { 
     if (operation.parameters == null) { 
      operation.parameters = new List<Parameter>(); 
     } 

     operation.parameters.Add(new Parameter { 
      name = "Foo-Header", 
      @in = "header", 
      type = "string", 
      required = true 
     }); 
    } 
} 

然後添加類我SwaggerConfig像這樣:

... 
c.OperationFilter<AddRequiredHeaderParameter>(); 
... 
+0

感謝您的回答。我對你提到的第一件事感興趣;即「當我第一次嘗試這個時,我能夠在用戶可以輸入授權標題的每個端點的參數字段區域中顯示授權標題文本。你是怎麼做的?正如問題中提到的,我希望用戶輸入授權標題,我不想讓授權標題自動填入。 – fikkatra

+0

@fikkatra對不起,不知道我是如何錯過的。請參閱編輯。 – hvaughan3

1

創建一個新的操作過濾器,實現IOperationFilter

public class AuthorizationHeaderOperationFilter : IOperationFilter 
{ 
    /// <summary> 
    /// Adds an authorization header to the given operation in Swagger. 
    /// </summary> 
    /// <param name="operation">The Swashbuckle operation.</param> 
    /// <param name="context">The Swashbuckle operation filter context.</param> 
    public void Apply(Operation operation, OperationFilterContext context) 
    { 
     if (operation.Parameters == null) 
     { 
      operation.Parameters = new List<IParameter>(); 
     } 

     var authorizeAttributes = context.ApiDescription 
      .ControllerAttributes() 
      .Union(context.ApiDescription.ActionAttributes()) 
      .OfType<AuthorizeAttribute>(); 
     var allowAnonymousAttributes = context.ApiDescription.ActionAttributes().OfType<AllowAnonymousAttribute>(); 

     if (!authorizeAttributes.Any() && !allowAnonymousAttributes.Any()) 
     { 
      return; 
     } 

     var parameter = new NonBodyParameter 
     { 
      Name = "Authorization", 
      In = "header", 
      Description = "The bearer token", 
      Required = true, 
      Type = "string" 
     }; 

     operation.Parameters.Add(parameter); 
    } 
} 

在您的Startup.cs文件中配置服務。

 services.ConfigureSwaggerGen(options => 
     { 
      options.OperationFilter<AuthorizationHeaderOperationFilter>(); 
     });