Swagger與JWT


Swagger與JWT

創建項目后首先我們要引用這幾個包

 

 

 

 打開appsettings.json在里面添加

  "LemonToken": {
"secret":"123456789123456789",
"issuer": "text.cn",//發行人
"audience": "test",//訂閱人
"accessExpiraction": 180000,//過期時間
"refreshExpiration": 60//刷新時間 秒
},

創建個文件夾tokens在里面創建個LemonToken類

  public class LemonToken
        {
            [JsonProperty("Secret")]
            public string Secret { get; set; }
            [JsonProperty("Issuer")]
            public string Issuer { get; set; }
            [JsonProperty("Audience")]
            public string Audience { get; set; }
            [JsonProperty("AccessExpiration")]
            public int AccessExpiration { get; set; }
            [JsonProperty("RefreshExpiration")]
            public string RefreshExpiration { get; set; }
        }

在右鍵項目屬性,點擊生成。找到XML文檔文件並打勾,在取消顯示警告(S):里面加上1591 

 

 

 在點擊Startup,找到 public void ConfigureServices(IServiceCollection services)並在里面加上

   var basePath = Microsoft.DotNet.PlatformAbstractions.ApplicationEnvironment.ApplicationBasePath;
                services.AddSwaggerGen(a => {
                    a.SwaggerDoc("a", new OpenApiInfo
                    {
                        Version = "a",
                        Title = "第一個接口標題",
                        Description = $"Description的描述",
                        Contact = new OpenApiContact
                        {
                            Name = "zhangsan",
                            Email = "1919675978@qq.com",
                            Url = new Uri("https://www.cnblogs.com/mvpbest/")
                        },
                        License = new OpenApiLicense
                        {
                            Name = "lisi",
                            Url = new Uri("https://www.cnblogs.com/mvpbest/")
                        }

                    });

                    a.OrderActionsBy(a => a.RelativePath);
                    var Xmalpath = Path.Combine(basePath, "JWTExercise.xml");
                    a.IncludeXmlComments(Xmalpath, true);
                    //SecurityDefinition安全定義
                    //公開的接口安全方案
                    a.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
                    {
                        Description = "在下框中輸入請求頭中需要添加Jwt授權Token:Bearer Token",
                        Name = "Authorization",
                        In = ParameterLocation.Header,
                        Type = SecuritySchemeType.ApiKey,
                        BearerFormat = "JWTExercise",
                        Scheme = "Bearer"
                    });

                    a.AddSecurityRequirement(new OpenApiSecurityRequirement
                    {
                        {
                            new OpenApiSecurityScheme{
                                Reference = new OpenApiReference {
                                            Type = ReferenceType.SecurityScheme,
                                            Id = "Bearer"}
                           },new string[] { }
                        }
                    });

                });
                LemonToken lemonToken = Configuration.GetSection("LemonToken").Get<LemonToken>();
                services.AddAuthentication("Bearer")
                    .AddJwtBearer(option => {

                        option.TokenValidationParameters = new TokenValidationParameters()
                        {
                            ValidateIssuerSigningKey = true,
                            ValidateIssuer = true,
                            ValidIssuer = lemonToken.Issuer,
                            ValidateAudience = true,
                            ValidAudience = lemonToken.Audience,
                            ValidateLifetime = true,
                            ClockSkew = new TimeSpan(30),
                            RequireExpirationTime = true,
                            SaveSigninToken = true,
                            IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(lemonToken.Secret))
                        };
                    });
                services.AddAuthorization(options => {
                    //單獨角色
                    options.AddPolicy("Client", policy => policy.RequireRole("Client").Build());
                    //或的關系
                    options.AddPolicy("SystemOrAdmin", policy => policy.RequireRole("Admin", "System").Build());
                    //與的關系
                    options.AddPolicy("SystemAndAdmin", policy => policy.RequireRole("System").RequireRole("Admin"));
                });

在找到Configure按下面寫,記得位置不能弄錯

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseSwagger();

            app.UseSwaggerUI(c => {

                c.SwaggerEndpoint($"swagger/a/swagger.json", $"a");// 將swagger設置成首頁
                //訪問該文件,注意localhost:8001/swagger是訪問不到的,
                //去launchSettings.json把launchUrl去掉
                c.RoutePrefix = "";
            });
            app.UseRouting();
            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

找到launchSettings.json按一下改

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {

    "JWTExercise": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "",
      "applicationUrl": "http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
} 

在創建一個Home控制器

[Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IConfiguration _configuration;
        public HomeController(IConfiguration configuration, ILogger<HomeController> logger)
        {
            _logger = logger;
            _configuration = configuration;
        }

        #region 獲取token
        /// <summary>
        /// token獲取接口數據
        /// </summary>
        [HttpGet]
        public string Gettoken()
        {
            LemonToken lemon = _configuration.GetSection("LemonToken").Get<LemonToken>();
            Claim[] claim = {
                new Claim(JwtRegisteredClaimNames.FamilyName,"猴三棍"),
                new Claim(JwtRegisteredClaimNames.Sub,"屁股朝天"),
                new Claim(JwtRegisteredClaimNames.Email,"120@qq.com"),
                new Claim(ClaimTypes.Role,"Client")
            };
            JwtSecurityToken token = new JwtSecurityToken(
                issuer: lemon.Issuer,
                audience: lemon.Audience,
                claims: claim,
                expires: DateTime.Now.AddMinutes(lemon.AccessExpiration),
                signingCredentials: new SigningCredentials(
                    new SymmetricSecurityKey(Encoding.ASCII.GetBytes(lemon.Secret))
                    , SecurityAlgorithms.HmacSha256)
                );
            string JwtToken = new JwtSecurityTokenHandler().WriteToken(token);
            return JwtToken;

        }
        #endregion
        [HttpGet]
        [Authorize]
        public string Find()
        {
            return "成功";
        }
    }

點擊執行

 

 直接點擊無法顯示輸出的值

 

 

 

 

 

 而你先點擊下面的獲取到了密鑰,在登陸就可以有權限了

 

 

 

 

 


免責聲明!

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



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