zoukankan      html  css  js  c++  java
  • 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 "成功";
            }
        }

    点击执行

     直接点击无法显示输出的值

     

     而你先点击下面的获取到了密钥,在登陆就可以有权限了

     

  • 相关阅读:
    ListView添加HeaderView的顺序问题
    shape与selector配合使用实现Tab下划线效果
    在java代码中设置TextView的字体大小,单位设为sp
    一个textView中的文字设置成两种颜色
    Android studio生成类图
    linux常用命令总结
    主机CPU与显卡选择
    电脑与显示器四种接口
    Linux shell
    Linux 常用命令二
  • 原文地址:https://www.cnblogs.com/mvpbest/p/13227551.html
Copyright © 2011-2022 走看看