.Net6 Web Api JWT 身份验证

863 阅读1分钟

配置密钥

在appsettings.json里添加

"JWT": {
    "Key": "kkkkkkkkkkkkkkkkkkkkkkkkkk",
    "Issuer": "II",
    "Audience": "AA"
  }

添加服务

在Program.cs中添加服务

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            //非固定可选可加
            ValidateIssuer = true,
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidateAudience = true,
            ValidAudience = builder.Configuration["Jwt:Audience"],
            //时间
            ValidateLifetime = true,
            ClockSkew = TimeSpan.Zero,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:KEY"]))
        };
    });
//所有控制器启动身份验证
builder.Services.AddMvc(options =>
{
    options.Filters.Add(new AuthorizeFilter());
});
app.UseAuthentication();
app.UseAuthorization();

登录Api

登录控制器添加

QQ截图20220303153335.png

写入JWT的登录api

[HttpPost]
        public string JWTLogin(User user)
        {
            if (_context.User.Any(x => x.Account == user.Account))
            {
                var result = _context.User.Include(x => x.Role).Where(x => x.Account == user.Account && x.PassWord == user.PassWord).FirstOrDefault();
                if (result == null)
                {
                    return "账号或者密码错误";
                }
                else
                {
                    var claims = new List<Claim>
                    {
                        new Claim(JwtRegisteredClaimNames.Email, result.Account),
                        new Claim("昵称", result.Name),
                        new Claim(ClaimTypes.Role,result.Role.Name)
                    };
                    var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT:Key"]));
                    var jwt = new JwtSecurityToken
                    (
                        issuer: _configuration["JWT:Issuer"],
                        audience: _configuration["JWT:Audience"],
                        claims:claims,
                        //有效时间
                        expires:DateTime.Now.AddMinutes(30),
                        signingCredentials:new SigningCredentials(securityKey,SecurityAlgorithms.HmacSha256)
                    );
                    var token = new JwtSecurityTokenHandler().WriteToken(jwt);
                    return token;
                }
            }
            else
            {
                return "账号不存在";
            }
        }

取出登录用户信息

Program.cs添加

builder.Services.AddHttpContextAccessor();

在控制器

QQ截图20220304142006.png

var userName = _httpContextAccessor.HttpContext.User.FindFirstValue("昵称");

\