.NET Core使用JWT身份认证模拟登陆

本文介绍如何使用JWT(JSON Web Tokens)进行模拟登录,详细展示了创建JWT的过程,包括设置header、payload和签名。此外,还阐述了在Startup类中配置身份验证服务以验证JWT,并通过[Authorize]装饰器实现权限控制,限制只有特定角色的用户才能访问特定资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引入NuGet包JwtBearer

模拟登陆方法:

 [HttpPost("login")]
        public IActionResult login([FromBody]LoginDto loginDto)
        {

            //创建JWT

            //header
            var signingAlgorithm = SecurityAlgorithms.HmacSha256;

            //payload
            var claims = new[]
            {
                //sub/id
                new Claim(JwtRegisteredClaimNames.Sub,"moniID"),
                new Claim(ClaimTypes.Role,"Admin"),
                new Claim(ClaimTypes.Name,"张三")
            };

            //signiture  需要使用到私钥
            var secretByte = Encoding.UTF8.GetBytes(_configuration["Authentication:SecreKey"]);
            var signingKey = new SymmetricSecurityKey(secretByte);
            var signingCredentials = new SigningCredentials(signingKey, signingAlgorithm);
            var token = new JwtSecurityToken(
                    issuer: "JWTdemo.com",
                    audience: "JWTdemo.com",
                    claims,
                    notBefore: DateTime.UtcNow,
                    expires: DateTime.UtcNow.AddDays(1),
                    signingCredentials
                );
            var tokenstring = new JwtSecurityTokenHandler().WriteToken(token);
            return Ok(tokenstring);
        }

 返回的token可以在客户端保存,在之后的每次请求服务器资源中在header携带token:此处用postman实例:

 在start up类中增加身份认证服务:

  var audienceConfig = Configuration.GetSection("Audience");
            var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["Authentication:SecreKey"]));
            var tokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = signingKey,    //自定义的私钥,存放在服务器
                ValidateIssuer = true,
                ValidIssuer = "JWTdemo.com",    //发布者
                ValidateAudience = true,
                ValidAudience = "JWTdemo.com",    //对谁发布
                ValidateLifetime = true,        //设置token是否过期
                ClockSkew = TimeSpan.Zero,
                RequireExpirationTime = true,
            };
            //注入Jwt验证
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options => {
                    options.RequireHttpsMetadata = false;
                    options.TokenValidationParameters = tokenValidationParameters;
                });

在需要使用到token请求的资源上加上身份认证声明,此处用一个获得一个字符串的action实例:

        [HttpGet("getstring")]
        [Authorize(Roles =  "Admin")]
        public string getstring([FromQuery] string name)
        {
            return "带土";
        }

[Authorize(Roles =  "Admin")]加上(Roles =  "Admin")指在登录时claim声明中角色为Admin的用户才能够请求,若不加上则所有用户都能够请求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值