.NET 6 WebApi Swagger 配置 JWT token+Authorize认证

本篇文章简易介绍 .Net6 Weapi Jwt的认证过程,在此之前简易介绍一下jwt的常见问题

转载:JWT详解_jwt 解析_小昵称爱吃唐的博客-CSDN博客

流程可以根据下方的流程图做解析,

 

首先大家要打开VS2022创建SP.NET Core WebApi 的项目

然后下载可以配置Jwt的 的Nuget包

Microsoft.AspNetCore.Authentication.JwtBearer

我这里下载的是6.0版本的   下载时提示报错和自己的版本不搭配,大家看自己core的版本而定吧

6.0的net 就要用6.0的jwt

appsetting.json文件添加Jwt配置,瞎写就行,但是得满足有着三个字段,因为JWT配置的时候要用

  "JWT": {
    "ISyouuser": "www.baidu.com.cn",//发行者
    "IsAudience": "www.Audience.com.cn",//接收者
    "SignKey": "000000000000000000"//秘钥
  },

 在Program.cs添加token验证,这里有需要用到的发行者、接受者、秘钥Key   是读取的json的字符串

// 添加JWT token验证
builder.Services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
    x.RequireHttpsMetadata = false;
    x.SaveToken = true;
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(builder.Configuration.GetValue<string>("JWT:SignKey"))),//JWT秘钥
        ValidIssuer = builder.Configuration.GetValue<string>("JWT:ISyouuser"),//发行者,
        ValidAudience = builder.Configuration.GetValue<string>("JWT:IsAudience"),//接收者,
        ValidateIssuer = true,
        ValidateAudience = true,
        // 是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比
        ValidateLifetime = true,
        //注意这是缓冲过期时间,总的有效时间等于这个时间加上jwt的过期时间,如果不配置,默认是5分钟
        ClockSkew = TimeSpan.Zero
    };
});

同样是在在Program.cs添加

鉴权用的按钮:Authorize ,如果没有这个步骤就没有办法鉴权的   这步也是关键

//添加Swagger的Authiozer的按钮鉴权
builder.Services.AddSwaggerGen(s =>
{
    s.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
    s.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
    {
        Description = "在下框中输入请求头中需要添加Jwt授权Token:Bearer Token",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        BearerFormat = "JWT",
        Scheme = "Bearer"
    });

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


});

然后  我们还要启用验证,还是在program.cs下,注意顺序,不能乱,一定要先认证、再授权 ,否则会验证失败

app.UseAuthentication();// 认证中间件
app.UseAuthorization();//授权中间件

接下来我们新建一个Api控制器 

 

 写一个token 方法用来做测试,注意!!!如果要读取appsetting.json文件的数据必须在控制器里注入IConfiguration 

        private readonly IConfiguration _config;
        public ValuesController(IConfiguration configuration)
        {
            _config = configuration;
        }
        [HttpGet]
        [Route("/GetToken")]
        public ActionResult<string> GetToken()
        {
            //这里我写死了,后边可以写一个实体,输入用户名和密码放进这里
            var claims = new[]
           {
                new Claim(ClaimTypes.Name,"userName"),
                new Claim(ClaimTypes.Upn,"userPwd")
            };
            //发行者

            var isyouruser = _config.GetValue<string>("JWT:ISyouuser");
            //接受者

            var isAudience = _config.GetValue<string>("JWT:IsAudience");
            //秘钥key

            var scKey = _config.GetValue<string>("JWT:SignKey");
            //设置token的过期时间

            DateTime timeout = DateTime.Now.AddMinutes(30);
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(scKey));
            var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);


            var jwtToken = new JwtSecurityToken(isyouruser, isAudience, claims, expires: timeout, signingCredentials: credentials);

            var token = new JwtSecurityTokenHandler().WriteToken(jwtToken);

            return "Bearer " + token;
        }

然后在你需要授权的控制器加入属性[Authorize]

如下:

 然后我们来测试一下

测试一下   再我没有获取token的情况下  执行 需要授权的控制器 方法

不出意外返回401,是因为要有token的全局认证

那我们继续执行 token接口 

复制token串,点击打开控制器右上角的Authorize

将串放入

 然后依次点击 Authorize、Close

然后再去点击刚才的控制器

不出所料    授权成功,可以执行接口了

在这里稍稍提醒一下各位读者,在token接口里,我返回控制器方法token串是写的

"Bearer" + token

所以读者老爷如果只是单纯只返回token的时候,记得在控制器右上角的Authorize里  先写Bearer+空格+你的token

好了,今天的分享到这里,希望能够帮助到你,我们下期见  

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小小涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值