Asp.net core [单点登录sso] JWT与用户身份验证的具体实现

什么是 JWT – JSON WEB TOKEN
JWT官网

下面我们来具体实现
先为服务创建一个jwt
1.先给项目安装相应的包 如图:
Asp.net core [单点登录sso] JWT与用户身份验证的具体实现_第1张图片
提醒一下,这玩意要和你.net core框架版本一致。我用的3.1稳定版

接下来我们来在服务端使用JWT创建Token代码如下:

 [AllowAnonymous]//允许所有人访问
        [HttpPost("login")]
        public IActionResult login([FromBody] LoginDto loginDto) 
        {
            //1.进行信息认证(省略)

            //2.创建JWT  Token
            //header   singningAlgorithm储存编码算法
            var singningAlgorithm = SecurityAlgorithms.HmacSha256;
            //payload   需要用到的数据
            var claims = new[] { 
           // sub ==jwt的ID    
           //等同于  Sub:fake_user_id
           new Claim(JwtRegisteredClaimNames.Sub,"fake_user_id")
           };
            //signature   数字签名   需要用到私钥
            //私钥一般放在配置文件中  私钥是自定义的  想写什么写什么

            //使用utf进行编码
            var secretByte = Encoding.UTF8.GetBytes(_configuration["Authentication:SecretKey"]);
            //使用非对称算法 对私钥加密
            var signingkey = new SymmetricSecurityKey(secretByte);
            //通过256验证非对称加密的私钥
            var signingCredentials = new SigningCredentials(signingkey, singningAlgorithm);

            //创建token
            var token = new JwtSecurityToken(
                issuer:_configuration  ["Authentication:Issuer"],//谁发布的TOken
                audience:_configuration["Authentication:Audience"],//token发布给谁
           claims,//payload数据
           notBefore:DateTime.UtcNow,//发布时间
           expires:DateTime.UtcNow.AddDays(1),//有效时间
           signingCredentials//数字签名
                );

            //以字符串形式 输出Token
            var tokenStr = new JwtSecurityTokenHandler().WriteToken(token);

            //3.返回jwt字符串

            return Ok(tokenStr);
        }

接着 我们来访问一下这个API 看看返回结果。
Asp.net core [单点登录sso] JWT与用户身份验证的具体实现_第2张图片
可以看到返回200成功,并且把JWT字符串返回。
我们来去官网看下JWT创建的信息。
Asp.net core [单点登录sso] JWT与用户身份验证的具体实现_第3张图片

可以看到解析的结果和你创建的信息一致。这样就简单的实现了Token的创建。

接下来我们来使用Token访问受保护资源。

先注入JWT的认证服务。
代码如下:

//注入JWT验证依赖服务  AddAuthentication注册身份认证服务 参数为认证类型
            //AddJwtBearer  配置jwt认证  参数为委托
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options => {
                //获取密钥
                var secretByte = Encoding.UTF8.GetBytes(Configuration["Authentication:SecretKey"]);
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    //验证token发布者  只有后端Issuer发出的Token才被接受
                    ValidateIssuer = true,
                    ValidIssuer = Configuration["Authentication:Issuer"],
                    //token持有者
                    ValidateAudience = true ,
                    ValidAudience=Configuration["Authentication:Audience"],
                    //验证token是否过期
                    ValidateLifetime=true ,
                    //传如私钥并加密
                    IssuerSigningKey=new SymmetricSecurityKey(secretByte)

                };
            });

此代码写在Startup.cs的ConfigureServices中。
接着我们来启动服务框架。
在Startup.cs类的Configure函数添加如下代码 切记 启动顺序不能错。

Asp.net core [单点登录sso] JWT与用户身份验证的具体实现_第4张图片
添加红色框框的代码。注意顺序不能错。
接着我们在受保护资源上加上对应的属性
Asp.net core [单点登录sso] JWT与用户身份验证的具体实现_第5张图片
[Authorize] 表示只有登录过的用户,拥有token的客户端才可以访问。用这个特性需要引入对应的命名空间
using Microsoft.AspNetCore.Authorization;
接下来我们来测试一下
Asp.net core [单点登录sso] JWT与用户身份验证的具体实现_第6张图片
后台给我们返回401 说明我们还没有登录,此时是访问不了的。
接着我们来使用上面获得的token来进行一次模拟登录。
Asp.net core [单点登录sso] JWT与用户身份验证的具体实现_第7张图片
这次我们可以看到 请求成功了。
请求时候一定要带上参数,Authorization:bearer+空格+JWT字符串

接着我们来试着给不同的用户添加不同的角色与权限

我们只需要在相应的Claim里面添加对应的角色在JWT字符串就行了。添加如下代码

Asp.net core [单点登录sso] JWT与用户身份验证的具体实现_第8张图片

在对应的方法中加入特性就行。
在这里插入图片描述
此时只有角色为Admin的才可以访问此方法。
好了暂时更新这么多。。。。

你可能感兴趣的:(.net,core,asp.net,JWT)