我在ASP.NET Web API上使用Swashbuckle和Swagger。我試圖找到一種方法來通過Swagger UI傳遞包含持票人令牌的授權標頭。我一直在四處搜尋,但所有的答案似乎指向this鏈接。Swagger UI:傳遞自定義授權標頭
但是,這假定標頭的內容是預先知道的。我真的需要一種方法來改變Swagger UI中的頭部(就在點擊'試試看!'按鈕之前),因爲持證者令牌每小時都會過期。類似於Postman允許您添加標題的方式。
這似乎是這樣一個可笑的簡單問題,但答案是什麼?
我在ASP.NET Web API上使用Swashbuckle和Swagger。我試圖找到一種方法來通過Swagger UI傳遞包含持票人令牌的授權標頭。我一直在四處搜尋,但所有的答案似乎指向this鏈接。Swagger UI:傳遞自定義授權標頭
但是,這假定標頭的內容是預先知道的。我真的需要一種方法來改變Swagger UI中的頭部(就在點擊'試試看!'按鈕之前),因爲持證者令牌每小時都會過期。類似於Postman允許您添加標題的方式。
這似乎是這樣一個可笑的簡單問題,但答案是什麼?
我們碰到了我們的項目同樣的問題。我也想將標題參數添加到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>();
希望這可以幫助你!
您可以通過不同的方式來完成,具體取決於您收集標頭的方式,以及您希望代碼處理所有事情,還是希望用戶能夠輸入他們想要的標頭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>();
...
創建一個新的操作過濾器,實現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>();
});
看來,最新版本的Swashbuckle改變了操作類來移除參數過濾器類?有什麼想法嗎? –
如果我創建過濾器,我所有的操作都要求它?我如何排除控制器操作不需要它? –