.netcore3.1添加swagger及JWT Authorize 驗證


首先引入Microsoft.AspNetCore.Authentication.JwtBearer  nuget包

在startup中加入jwt配置。這里ValidIssuer和ValidAudience和secret  最好配置一下,我這里寫死了。

 public static void AddSwagger(this IServiceCollection services)
        {

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo
                {
                    Title = "Cabinet.Core.API 接口文檔——Netcore 3.1",
                    Version = "v1",
                    Description = "Cabinet.Core.API HTTP API V1",

                });
                #region Jwt
                //開啟權限小鎖
                c.OperationFilter<AddResponseHeadersFilter>();
                c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();

                //在header中添加token,傳遞到后台
                //Swagger響應頭#
                //這里需要Nuget引用Swashbuckle.AspNetCore.Filters,oauth2需要寫死,SecurityRequirementsOperationFilter中默認securitySchemaName = "oauth2";
                //未添加該配置時,Bearer一直無法加入到JWT發起的Http請求的頭部,無論怎么請求都會是401;
                c.OperationFilter<SecurityRequirementsOperationFilter>();
                c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
                {
                    Description = "JWT授權(數據將在請求頭中進行傳遞)直接在下面框中輸入Bearer {token}(注意兩者之間是一個空格) \"",
                    Name = "Authorization",//jwt默認的參數名稱
                    In = ParameterLocation.Header,//jwt默認存放Authorization信息的位置(請求頭中)
                    Type = SecuritySchemeType.ApiKey
                });


                #endregion
                //xml注釋
                var basePath = PlatformServices.Default.Application.ApplicationBasePath;
                var xmlPath = Path.Combine(basePath, "Cabinet.Core.API.xml");
                c.IncludeXmlComments(xmlPath, true);
            });

            #region 添加驗證服務

            // 添加驗證服務
            services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(o =>
            {
                o.TokenValidationParameters = new TokenValidationParameters
                {
                    // 是否開啟簽名認證
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("111111111111111111111111111111111111111111111111111")),
                    // 發行人驗證,這里要和token類中Claim類型的發行人保持一致
                    ValidateIssuer = true,
                    ValidIssuer = "API",//發行人
                    // 接收人驗證
                    ValidateAudience = true,
                    ValidAudience = "User",//訂閱人
                    ValidateLifetime = true,
                    ClockSkew = TimeSpan.Zero,
                };
            });
            #endregion

        }

  

再來一個獲取Token的接口

 [AllowAnonymous]
        [HttpGet,Route("/GetToken")]
        public ActionResult<string> GetToken()
        {
            //DateTime utc = DateTime.UtcNow;
            var claims = new List<Claim>
            {
                new Claim(JwtRegisteredClaimNames.Jti,"1"),//編號
                new Claim(JwtRegisteredClaimNames.Iat, $"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),//簽發時間
                new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"),//生效時間
                 // 過期時間 100秒
                new Claim(JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddSeconds(100)).ToUnixTimeSeconds()}"),
                new Claim(JwtRegisteredClaimNames.Iss,"API"), // 簽發者
                new Claim(JwtRegisteredClaimNames.Aud,"User") // 接收者
            };


            // 密鑰
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("111111111111111111111111111111111111111111111111111"));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            var tokenHandler = new JwtSecurityTokenHandler();

            JwtSecurityToken jwt = new JwtSecurityToken(

                claims: claims,// 聲明的集合
                               //expires: .AddSeconds(36), // token的有效時間
                signingCredentials: creds
                );
            var handler = new JwtSecurityTokenHandler();
            // 生成 jwt字符串
            var strJWT = handler.WriteToken(jwt);
            return Ok(strJWT);
        }

在startup管道中啟用授權app.UseAuthentication();

運行一下,訪問天氣接口,發現訪問不了,因為加了[Authorize]特性后需要認證,如下圖,出現401沒有權限的標志。 

 

 

 

訪問swagger主頁出現一個Authorize的標志,點擊可以輸入jwt的驗證字符。

 

 運行獲取weatherforecast接口,運行結果還是401,因為我們在接口添加了【Authorize】后接口需要一個認證

 

 現在去拿一下token,運行GetToken,獲取Token字符串,

 

 將字符串添加到swagger提供的Authorize認證框里面,粘貼token之前要寫上Bearer加一個空格,再粘上token.點擊Authorize,完成。

 

 

 

 再次運行獲取天氣接口

 


免責聲明!

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



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