net Core3.1 Swagger加JWT權限


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  寫的,這是個大神,很牛逼,大家可以看看


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM