.net Core 2022 使用JwtBearer 6个步骤完成鉴权授权

环境:

Visual Studio 2022  + .NET 7.0

步骤1:

安装:Microsoft.AspNetCore.Authentication.JwtBearer 7.0.9

步骤2:

在appsettings中把秘钥的信息配置加上去。

代码如下:

  //秘钥配置
  "MyTokenOptions": { //内容随便写都行
    "Issuer": "www.abc.com", //授予人
    "Audience": "www.abc.com", //接收人
    "SecurityKey": "asdfadfasdjflasdflasdjfkl" //密钥
  }


 

步骤3:

在Program中读取配置、并配置鉴权和授权,需要引用包。

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Identity;
using Microsoft.IdentityModel.Tokens;

//读取配置
var Configuration = builder.Configuration;
builder.Services.Configure<MyTokenOptions>(Configuration.GetSection("MyTokenOptions"));
MyTokenOptions tokenOptions = new MyTokenOptions();//初始化
Configuration.Bind("MyTokenOptions", tokenOptions);//实现调用


//鉴权
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            //JWT有一些默认的属性,就是给鉴权时就可以筛选了
            ValidateIssuer = false,//是否验证Issuer
            ValidateAudience = false,//是否验证Audience
            ValidateLifetime = false,//是否雅正失效时间
            ValidateIssuerSigningKey = true,//是否验证SecurityKey
            ValidAudience = tokenOptions.Audience,
            ValidIssuer = tokenOptions.Issuer,//Issuer,这两项喝前面签发jwt的设置一致
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(tokenOptions.SecurityKey))
        };
    });


//授权
builder.Services.AddAuthorization();



步骤4:

在项目中创建一个TokenOptions类:

    public class MyTokenOptions
    {
        /// <summary>
        /// 授予人
        /// </summary>
        public string Audience { get; set; }

        /// <summary>
        /// 接收人
        /// </summary>
        public string Issuer { get; set; }
        /// <summary>
        /// 秘钥
        /// </summary>
        public string SecurityKey { get; set; }
    }
步骤5:

创建一个接口:

    public interface IJWTService
    {
        string GetToken(string name);
    }

创建一个类用于封装Token相关的操作:

using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

namespace SelfHeating.Tool
{
    public class JWTService : IJWTService
    {
        private MyTokenOptions _JWTTokenOptions = null;

        public JWTService(IOptions<MyTokenOptions> options)
        {
            this._JWTTokenOptions = options.Value;
        }

        /// <summary>
        /// 生成Token就2个步骤:
        /// 1  组装信息
        /// 2  加密---JWT依赖一系列信息
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public string GetToken(string name)
        {
            var claims = new[]
            {
                 new Claim("Name", name),
                 new Claim("id", "11"),
                 #region 为授权添加
                 new Claim(ClaimTypes.Name, "ZhangLei"),
                 new Claim("EMail", "57265177@qq.com"),
                 //new Claim(ClaimTypes.Email, "xuyang@zhaoxiedu.net"),
                 //new Claim("Account", "Administrator"),
                 new Claim("Age", "35"),
                 new Claim("Mobile", "18664876666"),
                 new Claim(ClaimTypes.Role,"Admin"),
                 new Claim("Role", "Assistant"),//这个不能默认角色授权,动态角色授权
                 new Claim("Sex", "1")//各种信息拼装
	                #endregion
 
            };

            /*
             在 ASP.NET Core 中,您可以使用 SymmetricSecurityKey 类来表示对称加密算法的密钥。
            对称加密算法使用相同的密钥用于加密和解密数据,因此该密钥必须保密并且仅在通信双方之间共享。
            在您提供的代码中,this._JWTTokenOptions.SecurityKey 是用于创建 JWT 签名凭据的密钥字符串。
            Encoding.UTF8.GetBytes 方法将该字符串转换为字节数组,然后使用该字节数组创建一个 SymmetricSecurityKey 对象。
            在 JWT 身份验证中,该密钥用于加密和解密 JWT 数据。
             */
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(this._JWTTokenOptions.SecurityKey));
            /*
             在 ASP.NET Core 中,您可以使用 SigningCredentials 类创建用于 JWT(JSON Web Token)身份验证的签名凭据对象。
            JWT 是一种开放标准,用于在各种应用程序和服务之间安全地传输信息。JWT 由三部分组成:头部、载荷和签名。
            在您提供的代码中,key 是一个 SymmetricSecurityKey 对象,用于存储加密和解密 JWT 数据的密钥值。
            SecurityAlgorithms.HmacSha256 表示使用 HMAC-SHA256 算法进行签名。SigningCredentials 类将这些参数组合在一起,
            创建用于 JWT 签名的签名凭据对象。
             */
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            /**
             * Claims (Payload)
                Claims 部分包含了一些跟这个 token 有关的重要信息。 JWT 标准规定了一些字段,下面节选一些字段:
                iss: The issuer of the token,token 是给谁的
                sub: The subject of the token,token 主题
                exp: Expiration Time。 token 过期时间,Unix 时间戳格式
                iat: Issued At。 token 创建时间, Unix 时间戳格式
                jti: JWT ID。针对当前 token 的唯一标识
                除了规定的字段外,可以包含其他任何 JSON 兼容的字段。
             * */
            var token = new JwtSecurityToken(
                issuer: this._JWTTokenOptions.Issuer,
                audience: this._JWTTokenOptions.Audience,
                claims: claims,
                expires: DateTime.Now.AddSeconds(60 * 10),//10分钟有效期
                notBefore: DateTime.Now,//立即生效  DateTime.Now.AddMilliseconds(30),//30s后有效
                signingCredentials: creds);
            string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
            return returnToken;
        }

    }
}
步骤6:

将JwtService服务加入到容器中:

builder.Services.AddSingleton<IJWTService, JWTService>();

配置完成以上步骤咱们就可以测试了。

完整的示例地址:

https://download.csdn.net/download/heima2345/88175088

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值