引言
在 上一篇 中提到了 Swagger 的基本使用,僅限于沒有引數,沒有驗證的那種api檔案生成,那么這篇就連接上篇繼續,在一般具有安全性、權限等驗證的介面上,
都會在header/url中加上請求者的秘鑰、簽名等,當然也有可能添加到body等其它地方, Swashbuckle.AspNetCore 都支持這些寫法,
如何使用 -- 下面將介紹兩種使用方式
兩種方式引數設定到何處都是在 In屬性上,屬性對于值如下: 參考 https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#parameter-object
- query: 引數欄位值對應放在url中
- header: 引數值對應放在header param中
- body: 引數對應放到請求體中
- path: 引數應該對應放到請求路徑 // 具體貌似沒用
- formData: 引數對應放到請求表單中
第一種:將一個或多個引數保護API的“securityDefinitions”添加到生成的Swagger中,
這種是直接在檔案的右上方添加一個 Authorize 按鈕,設定了值后,每一個請求都會在設定的位置上加上相應的值,在 上一篇隨筆中的 ConfigureServices 方法中,
對應位置 services.AddSwaggerGen(options =>{}) 中的 XmlComments 下 添加代碼如下:
options.AddSecurityDefinition("token", new ApiKeyScheme { Description = "token format : {token}",//引數描述 Name = "token",//名字 In = "header",//對應位置 Type = "apiKey"//型別描述 }); options.AddSecurityDefinition("sid", new ApiKeyScheme { Description = "sid format : {sid}",//引數描述 Name = "sid",//名字 In = "header",//對應位置 Type = "apiKey"//型別描述 }); //添加Jwt驗證設定 設定為全域的,不然在代碼中取不到 options.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>> { { "token", Enumerable.Empty<string>() }, { "sid", Enumerable.Empty<string>() }, });
添加完成后,運行起來看下效果,效果圖:


設定上對應值,呼叫測驗方法,可以在header中取到剛設定到的值,

這里能看到,可以取到設定的引數了,這樣一來,在需要驗證的介面上,我們就可以通過介面檔案來測驗了,基本不用再借助postman等介面測驗工具了,
但是,但是,這里有一個問題,就是只要設定了引數值,每一次訪問都會在請求中帶上引數,
下面將介紹第二種方式,只給需要驗證用戶的介面上添加驗證引數,
第二種:使用“filters”擴展Swagger生成器,來實作只在需要添加引數的方法上添加引數,復雜的可以根據自己的需求來添加對應引數
實作方式就是先新建一個類,名: SwaggerParameter ,實作 IOperationFilter 介面,SwaggerParameter 類代碼如下:
/// <summary> /// 自定義添加引數 /// </summary> public class SwaggerParameter : IOperationFilter { /// <summary> /// 實作 Apply 方法 /// </summary> /// <param name="operation"></param> /// <param name="context"></param> public void Apply(Operation operation, OperationFilterContext context) { if (operation.Parameters == null) operation.Parameters = new List<IParameter>(); var attrs = context.ApiDescription.ActionDescriptor.AttributeRouteInfo; var t = typeof(BaseUserController); //先判斷是否是繼承用戶驗證類 if (context.ApiDescription.ActionDescriptor is ControllerActionDescriptor descriptor && context.MethodInfo.DeclaringType?.IsSubclassOf(t) == true) { //再驗證是否允許匿名訪問 var actionAttributes = descriptor.MethodInfo.GetCustomAttributes(inherit: true); bool isAnonymous = actionAttributes.Any(a => a is AllowAnonymousAttribute); // 需要驗證的方法添加 if (!isAnonymous) { operation.Parameters.Add(new NonBodyParameter() { Name = "sid", In = "header", //query header body path formData Type = "string", Required = true,//是否必選 Description = "登錄回傳的sid" }); operation.Parameters.Add(new NonBodyParameter() { Name = "token", In = "header", //query header body path formData Type = "string", Required = true,//是否必選 Description = "登錄回傳的token" }); } } } }
運行起來后,進入到 https://localhost:5001/apidoc/index.html 檔案頁面,可以看到右上角的 Authorize 按鈕已經不見了,在不需要驗證的方法上,也找不到相應需要設定引數的輸入框,就只有在需要驗證的介面上才有,
參考Swagger檔案圖如下:

參考代碼圖如下:
效果圖:

這樣一來設定也就完成了,從上面就能看出,就只有需要用戶驗證的介面才會有相應引數,
我的設定方式是先定義了用戶驗證控制器類,讓需要用戶驗證的控制器繼承該控制器,然后在該控制器中不需要用戶驗證的介面上加上 AllowAnonymous 屬性
設定fitter時就可以根據上面提到的兩個點來進行判斷是否需要加上引數,如果不是這樣實作的,可以根據自己的需求變更fitter類,來控制檔案的生成,
以上若有什么不對或可以改進的地方,望各位指出或提出意見,一起探討學習~
有需要原始碼的可通過此 GitHub 鏈接拉取 覺得還可以的給個 start 和點個 下方的推薦哦~~謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/89739.html
標籤:.NET Core
上一篇:ASP.NET Core 2.2 WebApi 系列【七】泛型倉儲模式和作業單元
下一篇:.NET高級特性-Emit(1)
