1、Swagger中開啟JWT服務
#region swagger services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "My API", Version = "v1" }); var basePath = AppContext.BaseDirectory; var xmlPath = Path.Combine(basePath, "Blog.Core.xml"); c.IncludeXmlComments(xmlPath, true); //添加控制器層注釋(true表示顯示控制器注釋) var xmlModelPath = Path.Combine(basePath, "Blog.Core.Model.xml"); c.IncludeXmlComments(xmlModelPath, true); #region Jwt //開啟權限小鎖 c.OperationFilter<AddResponseHeadersFilter>(); c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>(); //在header中添加token,傳遞到后台 c.OperationFilter<SecurityRequirementsOperationFilter>(); c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme { Description = "JWT授權(數據將在請求頭中進行傳遞)直接在下面框中輸入Bearer {token}(注意兩者之間是一個空格) \"", Name= "Authorization",//jwt默認的參數名稱 In = ParameterLocation.Header,//jwt默認存放Authorization信息的位置(請求頭中) Type = SecuritySchemeType.ApiKey }); #endregion }); #endregion
然后執行代碼,就可以在 swagger/index.html 頁面里看到這個Token入口了:
大家點開,看到輸入框,在輸入Token的時候,需要在Token令牌的前邊加上Bearer (為什么要加這個,下文會說明,請一定要注意看,一定要明白為啥要帶,因為它涉及到了什么是授權,什么是認證,請注意看下文),比如是這樣的:
1:第一步、API接口授權
授權處理,這里可以直接在api接口上,直接設置該接口所對應的角色權限信息:
這個時候我們就需要對每一個接口設置對應的 Roles 信息,但是如果我們的接口需要對應多個角色的時候,我們就可以直接寫多個:
這里有一個情況,如果角色多的話,不僅不利於我們閱讀,還可能在配置的時候少一兩個role,比如這個 api接口1 少了一個 system 的角色,再比如那個 api接口2 把 Admin 角色寫成了 Adnin 這種不必要的錯誤,真是很難受,那怎么辦呢,欸!這個時候就出現了基於策略的授權機制:
我們在 ConfigureService 中可以這么設置:
// 1【授權】、這個和上邊的異曲同工,好處就是不用在controller中,寫多個 roles 。 // 然后這么寫 [Authorize(Policy = "Admin")] services.AddAuthorization(options => { options.AddPolicy("Client", policy => policy.RequireRole("Client").Build());//單獨角色 options.AddPolicy("Admin", policy => policy.RequireRole("Admin").Build()); options.AddPolicy("SystemOrAdmin", policy => policy.RequireRole("Admin", "System"));//或的關系 options.AddPolicy("SystemAndAdmin", policy => policy.RequireRole("Admin").RequireRole("System"));//且的關系 });
這樣的話,我們只需要在 controller 或者 action 上,直接寫策略名就可以了:
[HttpGet] [Authorize(Policy = "SystemOrAdmin")] public ActionResult<IEnumerable<string>> Get() { return new string[] { "value1", "value2" }; }
2、第二步、配置認證服務
上邊第一步中,咱們已經對每一個接口api設置好了 授權機制 ,那這里就要開始認證,咱們先看看如何實現JWT的Bearer認證,關於什么是Bearer認證呢,可以下下邊的知識點介紹,簡單來說,就是定義的一套邏輯,用來將我們的Jwt三個部分進行處理和校驗,你看我們登錄的時候,有發行人,訂閱人和數字密鑰等,JWT Beaer 認證就是實現校驗這些的功能。
很簡單,只需要在 configureService 中,添加【統一認證】即可:
安裝 nuget 包 dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
//2.1【認證】 services.AddAuthentication(x => { //看這個單詞熟悉么?沒錯,就是上邊錯誤里的那個。 x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; })// 也可以直接寫字符串,AddAuthentication("Bearer") .AddJwtBearer(o => { o.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = signingKey,//參數配置在下邊 ValidateIssuer = true, ValidIssuer = audienceConfig["Issuer"],//發行人 ValidateAudience = true, ValidAudience = audienceConfig["Audience"],//訂閱人 ValidateLifetime = true, ClockSkew = TimeSpan.Zero, RequireExpirationTime = true, }; });
上邊代碼中出現的部分參數定義
//讀取配置文件 var audienceConfig = Configuration.GetSection("Audience"); var symmetricKeyAsBase64 = audienceConfig["Secret"]; var keyByteArray = Encoding.ASCII.GetBytes(symmetricKeyAsBase64); var signingKey = new SymmetricSecurityKey(keyByteArray); var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
appsetting.json 文件如圖,secret隨便寫
3、配置官方認證中間件
這個很簡單,還是在 configure 中添加:順序很重要
//開啟認證 app.UseAuthentication(); //授權中間件 app.UseAuthorization(); app.UseEndpoints(endpoints => { //endpoints.MapControllers(); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}" ); });
這樣就完成了,大家自行測試。
我的代碼寫亂了,參考:https://www.cnblogs.com/laozhang-is-phi/p/9511869.html#autoid-4-0-0 寫的,這是個大神,很牛逼,大家可以看看