您现在的位置是:首页 > 伤感句子

C# ASP.NET Core Web API 身份授权(JWT)验证(一)

作者:利杜鹃时间:2024-03-31 14:40:32分类:伤感句子

简介  文章浏览阅读6.7k次,点赞5次,收藏50次。C# ASP.NET Core Web API 身份授权(JWT)验证_asp.net jwt

点击全文阅读

1.开发环境 VS2022,安装时记得勾选ASP.NET有关的都选上,建议全选,省的麻烦。

        

2.创建初始工程 TestApi (你自己的工程名称)。

 

 这就创建工程成功了,按 F5 则可以进行调试了。

而在项目中,我们不仅仅会用到基础的api功能,我们一般还会用到 身份授权(JWT),Redis缓存,MySQL数据库 等,今天只讲身份授权(JWT)。后面文章将继续讲解其他两项。

--------------------添加 身份授权(JWT)--------------------

右键点击工程,选择 管理NuGet程序包 :

在 浏览 页面 搜索框 中输入 Microsoft.AspNetCore.Authentication.JwtBearer

点击安装即可(注意选择版本,选择大版本 6 即可):

 

 安装完成后,打开工程 appsettings.json 配置文件,添加JWT配置:

  "Jwt": {    "SecretKey": "u6u^Bdob@OJ&KF2RcAB%ybsoy&2S7jhP^SW!q!Z^FK7eB7F8CcxIHsIh4Ll3pL^#",    "Issuer": "WebAppIssuer",    "Audience": "WebAppAudience"  }

 下一步在工程目录下添加文件夹 Common :

 在Common 文件夹中添加 JWTHelper.cs 类:

 完整代码(其中命名空间 namespace TestApi.Common 改成你自己的即可 ):

using Microsoft.IdentityModel.Tokens;using System.IdentityModel.Tokens.Jwt;using System.Security.Claims;using System.Text;namespace TestApi.Common{    /// <summary>    /// 授权JWT类    /// </summary>    public class JwtHelper    {        private readonly IConfiguration _configuration;        /// <summary>        /// Token配置        /// </summary>        /// <param name="configuration"></param>        public JwtHelper(IConfiguration configuration)        {            _configuration = configuration;        }        /// <summary>        /// 创建Token 这里面可以保存自己想要的信息        /// </summary>        /// <param name="username"></param>        /// <param name="mobile"></param>        /// <returns></returns>        public string CreateToken(string username,string mobile)        {            // 1. 定义需要使用到的Claims            var claims = new[]            {            new Claim("username", username),            new Claim("mobile", mobile),            /* 可以保存自己想要信息,传参进来即可            new Claim("sex", "sex"),            new Claim("limit", "limit"),            new Claim("head_url", "xxxxx")            */        };            // 2. 从 appsettings.json 中读取SecretKey            var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]));            // 3. 选择加密算法            var algorithm = SecurityAlgorithms.HmacSha256;            // 4. 生成Credentials            var signingCredentials = new SigningCredentials(secretKey, algorithm);            // 5. 根据以上,生成token            var jwtSecurityToken = new JwtSecurityToken(                _configuration["Jwt:Issuer"],    //Issuer                _configuration["Jwt:Audience"],  //Audience                claims,                          //Claims,                DateTime.Now,                    //notBefore                DateTime.Now.AddSeconds(30),     //expires                signingCredentials               //Credentials            );            // 6. 将token变为string            var token = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);            return token;        }    }}

打开 Program.cs 文件,添加注册信息:

#region JWT服务// 注册JWT服务builder.Services.AddSingleton(new JwtHelper(builder.Configuration));builder.Services.AddAuthentication(options =>{    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(options =>{    options.TokenValidationParameters = new TokenValidationParameters()    {        ValidateIssuer = true, //是否验证Issuer        ValidIssuer = builder.Configuration["Jwt:Issuer"], //发行人Issuer        ValidateAudience = true, //是否验证Audience        ValidAudience = builder.Configuration["Jwt:Audience"], //订阅人Audience        ValidateIssuerSigningKey = true, //是否验证SecurityKey        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecretKey"])), //SecurityKey        ValidateLifetime = true, //是否验证失效时间        ClockSkew = TimeSpan.FromSeconds(30), //过期时间容错值,解决服务器端时间不同步问题(秒)        RequireExpirationTime = true,    };});#endregion//记得要添加此句--注册服务app.UseAuthorization();

 

 添加 Models 文件夹,再UserInfo.cs 类:

完整代码如下:

using System.ComponentModel.DataAnnotations;namespace TestApi.Models{    public class UserInfo    {        /// <summary>        /// 其中 [Required] 表示非空判断,其他自己研究百度        /// </summary>        [Required]        public string UserName { get; set; }        [Required]        public string Password { get; set; }        [Required]        public string PhoneNumber { get; set; }    }}

在Controllers文件夹中添加 API控制器 UserInfoController.cs

 完整代码:

using Microsoft.AspNetCore.Mvc;using TestApi.Common;using TestApi.Models;namespace TestApi.Controllers{    [Route("[controller]/[action]")]    [ApiController]    public class UserInfoController : ControllerBase    {        private readonly JwtHelper _jwt;        /// <summary>        /// 初始化        /// </summary>        /// <param name="jwtHelper"></param>        public UserInfoController(JwtHelper jwtHelper)        {            _jwt = jwtHelper;        }        /// <summary>        /// 获取Token        /// </summary>        /// <returns></returns>        [HttpPost]        public IActionResult GetToken(UserInfo user)        {            //参数验证等等....            if (string.IsNullOrEmpty(user.UserName))            {                return Ok("参数异常!");            }            //这里可以连接mysql数据库做账号密码验证            //这里可以做Redis缓存验证等等            //这里获取Token,当然,这里也可以选择传结构体过去            var token = _jwt.CreateToken(user.UserName, user.PhoneNumber);            return Ok(token);        }        /// <summary>        /// 获取自己的详细信息,其中 [Authorize] 就表示要带Token才行        /// </summary>        /// <returns></returns>        [HttpPost]        [Authorize]        public IActionResult GetSelfInfo()        {            //执行到这里,就表示已经验证授权通过了            /*             * 这里返回个人信息有两种方式             * 第一种:从Header中的Token信息反向解析出用户账号,再从数据库中查找返回             * 第二种:从Header中的Token信息反向解析出用户账号信息直接返回,当然,在前面创建        Token时,要保存进使用到的Claims中。            */            return Ok("授权通过了!");        }    }}

 然后,就可以 F5 测试了:

下一篇文章将继续介绍Redis:

C# ASP.NET Core Web API Redis使用教程(二)_asp.net redis教程_蛋蛋の微笑的博客-CSDN博客

点击全文阅读

郑重声明:

本站所有活动均为互联网所得,如有侵权请联系本站删除处理

我来说两句